Java 强制类实现实现另一个接口的两个接口之一

Java 强制类实现实现另一个接口的两个接口之一,java,annotations,Java,Annotations,我对Java注释不是很确定,但我认为它们可以解决我的问题 我有一个java接口“Target”。这是一个空接口,因此我可以将该实现放入“TargetHolder”中,它只是一个目标列表 现在我只有两种类型的目标。输入“Alpha”和“Beta” 类型“Alpha”与类型“Beta”没有共同的功能 最简单的方法是从“目标”扩展“Beta”和“Alpha”。但是有了这个解决方案,程序员就可以创建一个只扩展“Target”的类,这是不可能的 我可以用注释来解决这个问题吗 怎么做 理论上,您可以使用注释

我对Java注释不是很确定,但我认为它们可以解决我的问题

我有一个java接口“Target”。这是一个空接口,因此我可以将该实现放入“TargetHolder”中,它只是一个目标列表

现在我只有两种类型的目标。输入“Alpha”和“Beta”

类型“Alpha”与类型“Beta”没有共同的功能

最简单的方法是从“目标”扩展“Beta”和“Alpha”。但是有了这个解决方案,程序员就可以创建一个只扩展“Target”的类,这是不可能的

  • 我可以用注释来解决这个问题吗
  • 怎么做

  • 理论上,您可以使用注释处理器(在编译时)实现检查。问题是,javac只有在源文件中找到正确种类的注释时,才会对源文件运行注释处理器

    在扫描命令行上的源文件和类以确定存在哪些批注后,编译器将查询处理器以确定它们处理哪些批注。当找到匹配项时,将调用处理器

    (Javac手册)

    但您似乎希望在接口上使用注释来约束实现该接口的所有类。这意味着检查所有这些类。。。但我不明白如何在没有相关注释的类上触发注释处理器的运行

    这给您留下了两个选择:

    • 将检查作为(比如)PMD规则来实现
    • 编写一个工具,在运行时查找相关接口,检索它们的注释,然后搜索实现注释接口的所有类

    我的建议是把这个放在“太难”的篮子里。实现这一点可能需要比您在更早地发现相关编码错误时节省更多的时间。(我认为,当有人试图使用类时,您试图避免的情况就会出现。因此,您(或您的客户)应该在测试中发现您(或他们)的类不正确……

    如何

  • 为这项工作创建一个包。让我们称之为目标
  • 将Target.java放入包Target-package private中
  • 将Alpha.java放入包target-public中
  • 将Beta.java放入包target-public
  • 编译、jar和密封包目标
  • 使用类似工具可以强制执行设计规则。 在您的情况下,您可以使用以下cqlinq查询:

    warnif count > 0 from t in Types where t.Implement ("Target")
    && (!t.Implement("Alpha")|| !t.Implement("Beta"))
    select  t