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

时间:2014-01-22 14:44:02

标签: java annotations

我不太确定Java Annotations,但我认为它们可以解决我的问题。

我有一个java界面“Target”。这是一个空接口,所以我可以将该实现提供给“TargetHolder”,它只是一个目标列表。

现在我只有两种目标。输入“Alpha”并输入“Beta”。

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

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

  1. 我可以用注释解决这个问题吗?
  2. 如何?

3 个答案:

答案 0 :(得分:1)

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

  

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

(Javac手册)

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

这给你留下了几个选择:

  • 将检查实施为(比方说)PMD规则。
  • 编写工具以在运行时查找相关接口,检索其注释,然后搜索实现带注释接口的所有类。

我的建议是把它放到“太难”的篮子里。实现这一点可能需要花费更多时间,而不是在以前提取相关编码错误时节省的时间。 (我正在考虑当有人试图使用类时,你试图避免的情况会被接收。所以,你(或你的客户)应该在测试中找到你的(他们的)不正确的类...)

答案 1 :(得分:0)

怎么样?

  1. 仅为此工作创建一个包。让我们称之为目标。
  2. 将Target.java放入包目标 - package private。
  3. 将Alpha.java放入包目标 - public
  4. 将Beta.java放入包目标 - public
  5. 编译,jar和密封包目标。

答案 2 :(得分:0)

使用像JArchitect这样的工具可以强制执行设计规则。 在您的情况下,您可以使用以下cqlinq查询:

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