Java自定义注解参数中枚举与接口结合的灵活设计

java自定义注解参数中枚举与接口结合的灵活设计

本文探讨了在Java自定义注解中,如何优雅地将实现特定接口的枚举作为参数。针对注解参数不支持联合类型的限制,提出了一种通过引入中间值源接口(`MyInterfaceValueSource`)的解决方案。该方案不仅解决了枚举值作为接口类型集合传递的问题,还提升了注解的灵活性和可扩展性,使其能够支持非枚举类型的自定义值集合。

在Java开发中,自定义注解是实现元编程和配置的重要工具。有时,我们希望注解的参数能够接受一组特定的值,这些值通常由枚举定义,并且这些枚举本身还实现了某个业务接口。然而,直接在注解参数中声明一个既是枚举又是特定接口的类型,会遇到Java注解语法上的限制。

问题背景与初始尝试

假设我们有一个接口 MyInterface 和一个实现了该接口的枚举 MyEnum:

// 定义一个业务接口public interface MyInterface {    String getSomething();    int getMore();}// 实现 MyInterface 的枚举public enum MyEnum implements MyInterface {    VAL1("some1", 1),    VAL2("2val", 22);    private String something;    private int more;    private MyEnum(String something, int more) {        this.something = something;        this.more = more;    }    @Override    public String getSomething() {        return something;    }    @Override    public int getMore() {        return more;    }}

我们的目标是创建一个自定义注解 MyAnnotation,其参数能够接收 MyEnum 的类型,并允许我们后续获取 MyEnum 的所有实例,但这些实例又被视为 MyInterface 类型。最初的尝试可能是这样定义注解:

立即学习“Java免费学习笔记(深入)”;

// 尝试使用联合类型,但这是无效的语法public @interface MyAnnotation {    Class<? extends Enum & MyInterface> myValues(); // 编译错误!}

这种尝试会失败,因为Java注解的成员类型不支持联合类型(&)。注解参数只能是基本类型、String、Class、枚举、注解,以及这些类型的数组。因此,我们需要寻找一种更灵活、更符合Java注解规范的设计方案。

解决方案:引入值源接口

为了解决上述限制,我们可以引入一个中间接口 MyInterfaceValueSource。这个接口的职责是提供一个 MyInterface 类型的列表。这样,我们的注解参数就可以简单地接受实现 MyInterfaceValueSource 接口的类。

1. 定义值源接口

首先,定义 MyInterfaceValueSource 接口:

// 定义一个值源接口,用于提供 MyInterface 类型的集合public interface MyInterfaceValueSource {    List values();}

2. 实现值源接口

接下来,让我们的枚举 MyEnum(或者一个辅助类)实现 MyInterfaceValueSource 接口。由于 MyEnum.values() 已经提供了所有枚举实例,我们可以轻松地将其转换为 List。

// 为 MyEnum 提供一个 MyInterfaceValueSource 实现public class MyEnumValueSource implements MyInterfaceValueSource {    @Override    public List values() {        // 将 MyEnum 的所有实例作为 MyInterface 类型返回        return Arrays.asList(MyEnum.values());    }}

3. 修改自定义注解

现在,我们可以修改 MyAnnotation 的定义,使其接受 Class 类型:

灵图AI 灵图AI

灵图AI辅助设计平台

灵图AI 403 查看详情 灵图AI

import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;// 修改后的自定义注解@Retention(RetentionPolicy.RUNTIME) // 运行时可见@Target(ElementType.TYPE) // 作用于类、接口等public @interface MyAnnotation {    Class value(); // 接受 MyInterfaceValueSource 的实现类}

4. 注解的使用与值获取

使用这个新的注解就变得非常直观:

import java.util.List;import java.util.Collection;import java.util.Arrays;// 示例类,使用自定义注解@MyAnnotation(MyEnumValueSource.class)public class MyAnnotatedClass {    public static void main(String[] args) {        // 获取注解实例        MyAnnotation annotation = MyAnnotatedClass.class.getAnnotation(MyAnnotation.class);        if (annotation != null) {            // 获取 MyInterfaceValueSource 的实现类            Class valueSourceClass = annotation.value();            try {                // 实例化值源类并获取 MyInterface 集合                MyInterfaceValueSource valueSource = valueSourceClass.getDeclaredConstructor().newInstance();                List desiredValues = valueSource.values();                System.out.println("从注解中获取到的 MyInterface 值:");                for (MyInterface val : desiredValues) {                    System.out.println("  Something: " + val.getSomething() + ", More: " + val.getMore());                }            } catch (Exception e) {                e.printStackTrace();            }        }    }}

运行上述代码,将输出:

从注解中获取到的 MyInterface 值:  Something: some1, More: 1  Something: 2val, More: 22

这表明我们成功地从注解中获取了 MyEnum 的所有实例,并将其视为 MyInterface 类型进行处理。

灵活性与扩展性

这种设计模式的优势在于其极高的灵活性和可扩展性。它不仅限于枚举类型。如果将来有其他非枚举的类也需要提供 MyInterface 值的集合,它们也可以轻松地实现 MyInterfaceValueSource 接口,并被 MyAnnotation 所接受。

例如,一个非枚举类也可以提供 MyInterface 的实例集合:

// 另一个 MyInterface 的实现class MyInterfaceOne implements MyInterface {    @Override    public String getSomething() { return "One"; }    @Override    public int getMore() { return 10; }}class MyInterfaceTwo implements MyInterface {    @Override    public String getSomething() { return "Two"; }    @Override    public int getMore() { return 20; }}// 非枚举类实现 MyInterfaceValueSourceclass ExampleValueSource implements MyInterfaceValueSource {    @Override    public List values() {        return Arrays.asList(            new MyInterfaceOne(),            new MyInterfaceTwo()        );    }}

现在,MyAnnotation 同样可以接受 ExampleValueSource.class:

@MyAnnotation(ExampleValueSource.class)public class AnotherAnnotatedClass {    // ... 同样的方式获取 MyInterface 集合}

这大大增强了注解参数的通用性,避免了将注解参数与特定实现(如枚举)紧密耦合。

总结

当需要在Java自定义注解中将实现特定接口的枚举作为参数,并获取其所有实例时,直接使用联合类型是不被允许的。通过引入一个中间的“值源接口”(例如 MyInterfaceValueSource),让枚举(或其辅助类)实现该接口,并让注解参数接受这个值源接口的实现类,可以优雅地解决这个问题。这种设计不仅符合Java注解的语法规范,还提供了更高的灵活性和扩展性,使得注解能够处理更多样化的值集合来源。

以上就是Java自定义注解参数中枚举与接口结合的灵活设计的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/289899.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
《星球大战:前线2》Steam 1折促销 在线突破新纪录
上一篇 2026年10月20日 21:21:04
composer why-not命令怎么用它来排查为什么不能更新包
下一篇 2025年11月30日 09:56:23

相关推荐

  • 《星球大战:前线2》Steam 1折促销 在线突破新纪录

    《星球大战:前线2》Steam 1折促销 在线突破新纪录《星球大战:前线2》Steam 1折促销 在线突破新纪录《星球大战:前线2》Steam 1折促销 在线突破新纪录《星球大战:前线2》Steam 1折促销 在线突破新纪录

    ea于2017年11月推出的3a级经典游戏《星球大战:前线2》,其在steam平台的同时在线人数今天再次创下新高。就在10小时之前,本作的steam在线玩家数量突破了2万人(20311人),目前在线人数为16611人。 事实上,早在今年5月份,在忠实粉丝群体的推动下,《星球大战:前线2》的Steam…

    2026年10月20日 • 用户投稿
    1000
  • 数组置换检查:递归的局限性与高效解决方案

    数组置换检查:递归的局限性与高效解决方案数组置换检查:递归的局限性与高效解决方案数组置换检查:递归的局限性与高效解决方案数组置换检查:递归的局限性与高效解决方案

    本文深入探讨了如何判断两个整数数组是否互为置换。通过分析递归算法的核心原则,我们揭示了直接使用递归解决此问题时面临的效率挑战,特别是涉及状态修改(如元素移除)时的性能开销。文章随后提出并详细解释了一种更高效、基于排序的解决方案,该方法具有显著的性能优势,并提供了具体的代码示例和最佳实践建议。 在编程…

    2026年10月20日 • 用户投稿
    000
  • 大立光2024年资本支出冲新高后 2025年可能下滑

    大立光2024年资本支出冲新高后 2025年可能下滑大立光2024年资本支出冲新高后 2025年可能下滑大立光2024年资本支出冲新高后 2025年可能下滑大立光2024年资本支出冲新高后 2025年可能下滑

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 手机镜头巨头大立光2024年资本支出首破百亿新台币大关,达到107亿新台币,同比增长25%,创下历史新高。然而,大立光董事长林恩平在1月份的法说会上表示,新厂将于今年9月竣工,但未提及设备搬迁计…

    2026年10月20日 • 用户投稿
    500
  • 无线网卡驱动程序异常如何修复?提供6种更新与回滚网卡驱动的详细教程

    无线网卡驱动程序异常如何修复?提供6种更新与回滚网卡驱动的详细教程无线网卡驱动程序异常如何修复?提供6种更新与回滚网卡驱动的详细教程无线网卡驱动程序异常如何修复?提供6种更新与回滚网卡驱动的详细教程无线网卡驱动程序异常如何修复?提供6种更新与回滚网卡驱动的详细教程

    先判断问题根源再修复驱动。检查WiFi开关、测试网络环境,通过设备管理器确认驱动异常;可尝试自动更新、手动安装官方驱动、卸载重装或回滚驱动版本,配合系统自带疑难解答工具逐步解决。 无线网卡驱动异常导致无法上网,别急着重装系统或送修。大多数情况是驱动文件损坏、版本冲突或配置出错,通过正确的修复步骤几分…

    2026年10月20日 • 用户投稿
    500
  • 小米YU7官宣!6月26日与小米Flip 2等新品一同发布

    小米YU7官宣!6月26日与小米Flip 2等新品一同发布小米YU7官宣!6月26日与小米Flip 2等新品一同发布小米YU7官宣!6月26日与小米Flip 2等新品一同发布小米YU7官宣!6月26日与小米Flip 2等新品一同发布

    6月23日,小米集团创始人兼ceo雷军在其个人社交媒体账号上正式公布,备受瞩目的小米首款suv车型——小米yu7,将于6月26日(本周四)晚上7点正式亮相。本次发布会不仅将推出小米yu7,还将同步发布小折叠屏手机小米flip 2、搭载玄戒o1旗舰芯片的小米平板7s pro,以及一款“面向未来时代”的…

    2026年10月20日 • 用户投稿
    200
  • 如何在VSCode中调试Node.js应用

    如何在VSCode中调试Node.js应用如何在VSCode中调试Node.js应用如何在VSCode中调试Node.js应用如何在VSCode中调试Node.js应用

    首先配置launch.json文件,然后在VSCode中设置断点并启动调试,即可实现Node.js应用的断点调试、变量查看与控制台输出。 在VSCode中调试Node.js应用非常方便,只需简单配置即可实现断点调试、变量查看和控制台输出等功能。以下是具体操作步骤。 启用调试功能 VSCode内置了对…

    2026年10月20日 • 用户投稿
    000
  • Spring Boot JPA中利用数据引导机制按需创建数据库视图

    Spring Boot JPA中利用数据引导机制按需创建数据库视图Spring Boot JPA中利用数据引导机制按需创建数据库视图Spring Boot JPA中利用数据引导机制按需创建数据库视图Spring Boot JPA中利用数据引导机制按需创建数据库视图

    在spring boot jpa应用中,当需要使用数据库视图但又不想手动维护sql创建语句时,传统的`commandlinerunner`方式可能因启动顺序导致问题。本文介绍一种利用数据引导(data bootstrap)机制的解决方案,通过在应用启动时动态创建视图或加载初始数据,并结合`@prof…

    2026年10月20日 • 用户投稿
    000
  • 谷歌浏览器密码检查功能怎么用_谷歌浏览器密码安全检测使用说明

    谷歌浏览器密码检查功能怎么用_谷歌浏览器密码安全检测使用说明谷歌浏览器密码检查功能怎么用_谷歌浏览器密码安全检测使用说明谷歌浏览器密码检查功能怎么用_谷歌浏览器密码安全检测使用说明谷歌浏览器密码检查功能怎么用_谷歌浏览器密码安全检测使用说明

    首先通过安全检查功能可全面评估谷歌浏览器保存的密码安全性,具体操作包括:点击Chrome右上角三点菜单进入设置,选择“隐私设置和安全性”中的“安全检查”并点击“立即检查”,系统将扫描已保存密码是否出现在数据泄露中,存在风险的会以红色警告提示;用户也可直接进入“设置-自动填充-密码”页面,点击“检查密…

    2026年10月20日 • 用户投稿
    900
  • windows11如何启用游戏模式_Windows 11游戏性能优化与模式开启

    windows11如何启用游戏模式_Windows 11游戏性能优化与模式开启windows11如何启用游戏模式_Windows 11游戏性能优化与模式开启windows11如何启用游戏模式_Windows 11游戏性能优化与模式开启windows11如何启用游戏模式_Windows 11游戏性能优化与模式开启

    首先开启Windows 11游戏模式以提升性能,可通过设置应用、任务栏右键或搜索功能进入游戏模式页面并打开开关,系统将自动优化资源分配与帧率稳定性。 如果您在运行游戏时遇到性能不佳或资源分配不均的情况,可能是系统未针对游戏进行优化。Windows 11 提供了内置的游戏模式,可帮助提升游戏过程中的系…

    2026年10月20日 • 用户投稿
    100
  • 部署VSCode区块链智能合约开发套件与以太坊测试环境

    部署VSCode区块链智能合约开发套件与以太坊测试环境部署VSCode区块链智能合约开发套件与以太坊测试环境部署VSCode区块链智能合约开发套件与以太坊测试环境部署VSCode区块链智能合约开发套件与以太坊测试环境

    答案:搭建VSCode区块链开发环境需整合Solidity插件、Hardhat框架与本地节点。首先安装VSCode及Solidity、Prettier等插件,创建项目并初始化;通过npm安装Hardhat,配置hardhat.config.js设置Solidity版本和网络;使用npx hardha…

    2026年10月20日 • 用户投稿
    000
  • Java自定义注解参数化:以接口枚举作为灵活值源的策略

    Java自定义注解参数化:以接口枚举作为灵活值源的策略Java自定义注解参数化:以接口枚举作为灵活值源的策略Java自定义注解参数化:以接口枚举作为灵活值源的策略Java自定义注解参数化:以接口枚举作为灵活值源的策略

    本文探讨了在java自定义注解中,如何优雅地将实现特定接口的枚举类型作为注解参数。针对注解参数不支持联合类型的限制,提出了一种通过引入中间值源接口 (`myinterfacevaluesource`) 的解决方案。该方法不仅解决了直接传递枚举类的问题,还提升了注解参数的灵活性和可扩展性,允许非枚举类…

    2026年10月20日 • 用户投稿
    200
  • 操作系统支持周期对比:Windows 10与Android设备支持年限

    操作系统支持周期对比:Windows 10与Android设备支持年限操作系统支持周期对比:Windows 10与Android设备支持年限操作系统支持周期对比:Windows 10与Android设备支持年限操作系统支持周期对比:Windows 10与Android设备支持年限

    Windows 10支持周期已于2025年10月14日结束,不再提供安全更新,仅可通过付费ESU计划获取一年额外保护;而Android设备支持时长由厂商决定,Pixel和三星旗舰可达7年,其他品牌多为3至4年,核心差异在于Windows更新由微软统一管理,Android则依赖厂商自主实施。 Wind…

    2026年10月20日 • 用户投稿
    100
  • 探索VSCode Angular工程化与模块化管理

    探索VSCode Angular工程化与模块化管理探索VSCode Angular工程化与模块化管理探索VSCode Angular工程化与模块化管理探索VSCode Angular工程化与模块化管理

    答案:通过Angular CLI构建标准化项目结构,利用TypeScript模块机制与功能模块划分,结合懒加载优化性能,并借助VSCode插件提升开发效率,实现可维护可扩展的Angular应用。 在现代前端开发中,Angular 作为一个成熟的框架,强调工程化与模块化。结合 VSCode 这一高效编…

    2026年10月20日 • 用户投稿
    100
  • win10怎么把c盘的软件移动到d盘_win10软件搬移到其他盘教程

    win10怎么把c盘的软件移动到d盘_win10软件搬移到其他盘教程win10怎么把c盘的软件移动到d盘_win10软件搬移到其他盘教程win10怎么把c盘的软件移动到d盘_win10软件搬移到其他盘教程win10怎么把c盘的软件移动到d盘_win10软件搬移到其他盘教程

    首先使用专业迁移工具如易我电脑迁移将C盘软件安全迁移到D盘;其次可通过控制面板的“更改”功能移动支持该操作的软件;最后可修改注册表中ProgramFilesDir键值,将默认安装路径由C盘改为D盘并重启生效。 如果您发现 Windows 10 系统的 C 盘空间不足,而某些已安装的软件占用了大量空间…

    2026年10月20日 • 用户投稿
    100
  • 奥特曼被逼急:深夜上线 o3-mini,甚至免费,网友:还是选DeepSeek

    奥特曼被逼急:深夜上线 o3-mini,甚至免费,网友:还是选DeepSeek奥特曼被逼急:深夜上线 o3-mini,甚至免费,网友:还是选DeepSeek奥特曼被逼急:深夜上线 o3-mini,甚至免费,网友:还是选DeepSeek奥特曼被逼急:深夜上线 o3-mini,甚至免费,网友:还是选DeepSeek

    奥特曼能不急吗? 被 DeepSeek 狂轰乱炸了一周后,终于在今天发布了新的模型 o3-mini。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 此次发布,o3-mini 包含 low、medium 和 high 三个版本。 OpenAI…

    2026年10月20日 • 用户投稿
    100
  • Java中从URL字符串提取服务器名称的教程

    Java中从URL字符串提取服务器名称的教程Java中从URL字符串提取服务器名称的教程Java中从URL字符串提取服务器名称的教程Java中从URL字符串提取服务器名称的教程

    本教程将详细指导如何在java中使用`indexof`和`substring`方法,从给定的url字符串中准确提取服务器名称。文章将涵盖处理不同协议(如`http://`或`https://`)以及url末尾不含路径斜杠等多种情况,提供清晰的逻辑解析和实用的代码示例,帮助开发者构建健壮的url解析功…

    2026年10月20日 • 用户投稿
    300
  • 赛博树突觉醒!AI 仿生革命:更少参数,更强性能,过拟合?不存在的!

    赛博树突觉醒!AI 仿生革命:更少参数,更强性能,过拟合?不存在的!赛博树突觉醒!AI 仿生革命:更少参数,更强性能,过拟合?不存在的!赛博树突觉醒!AI 仿生革命:更少参数,更强性能,过拟合?不存在的!赛博树突觉醒!AI 仿生革命:更少参数,更强性能,过拟合?不存在的!

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 编辑丨& 人工神经网络(ANN)是大多数深度学习(DL)算法的核心,这些算法可以成功解决图像识别、自动驾驶和自然语言处理等复杂问题。然而,与能够高效解决类似问题的生物大脑不同,DL 算法…

    2026年10月20日 • 用户投稿
    200
  • QQ邮箱网页版登录口 2026直接访问QQ邮箱官网链接

    QQ邮箱网页版登录口 2026直接访问QQ邮箱官网链接QQ邮箱网页版登录口 2026直接访问QQ邮箱官网链接QQ邮箱网页版登录口 2026直接访问QQ邮箱官网链接QQ邮箱网页版登录口 2026直接访问QQ邮箱官网链接

    qq邮箱作为一款由腾讯公司推出的经典且功能强大的电子邮件服务,凭借其多年的稳定运营和持续创新,已成为亿万用户处理个人事务和工作沟通的重要工具。它不仅仅是一个收发邮件的平台,更是一个集成了大容量存储、文件中转、日程管理和移动办公于一体的综合性通讯枢纽,以其卓越的稳定性和与qq、微信等社交生态的无缝衔接…

    2026年10月20日 • 用户投稿
    500
  • 《巫师4》首批官方壁纸发布 PC和手机端都有

    《巫师4》首批官方壁纸发布 PC和手机端都有《巫师4》首批官方壁纸发布 PC和手机端都有《巫师4》首批官方壁纸发布 PC和手机端都有《巫师4》首批官方壁纸发布 PC和手机端都有

    近日,《巫师》官方账号发布了《巫师4》技术演示中的全新壁纸,首次展示了游戏中的新区域——科维尔。 与此同时,《巫师4》官方网站也公开了本作的首批详细信息: 开启巫师系列新篇章 《巫师4》是由 CD PROJEKT RED 打造的一款单人开放世界角色扮演游戏。作为系列新篇章的起点,玩家将首次以希里的身…

    2026年10月20日 • 用户投稿
    000
  • win11登录界面没有密码输入框怎么办_Windows11登录界面密码问题解决方法

    win11登录界面没有密码输入框怎么办_Windows11登录界面密码问题解决方法win11登录界面没有密码输入框怎么办_Windows11登录界面密码问题解决方法win11登录界面没有密码输入框怎么办_Windows11登录界面密码问题解决方法win11登录界面没有密码输入框怎么办_Windows11登录界面密码问题解决方法

    登录界面无密码框可尝试快捷键Ctrl+Alt+Delete调出;02. 检查是否启用无密码登录,需关闭Windows Hello仅登录设置;03. 通过安全模式重置启动配置为正常模式;04. 排查键盘或外设故障导致的输入失灵问题。 如果您在启动或唤醒Windows 11电脑时,登录界面未显示密码输入…

    2026年10月20日 • 用户投稿
    300

发表回复

登录后才能评论
关注微信