在java注释中键入层次结构

时间:2012-09-06 06:35:25

标签: java inheritance annotations hierarchy

我在注释中创建一些元数据结构时遇到问题。我们使用注释来定义hibernate实体属性的特殊属性,但它可以在任何地方使用。 我想创建代表这些结构的条件:

attribute1 = ...
OR
  (attribute2 = ...
   AND
   attribute3 = ...)

问题是我需要使用这个注释来定义一些“树”结构。这是我想要达到的一些设计:

@interface Attribute {
  ... some attributes ...
}

@interface LogicalExpression {
}

@interface OR extends LogicalExpression {
  Attribute[] attributes() default {};
  LogicalExpression logicalExpressions() default {};
}

@interface AND extends LogicalExpression {
  Attribute[] attributes() default {};
  LogicalExpression logicalExpressions() default {};
}

@interface ComposedCondition {
  Attribute[] attributes() default {};
  LogicalExpression logicalExpressions() default {};
}

我想根据这个例子使用所有这些注释:

public class Table {

  @ComposedCondition(logicalExressions = {
    @OR(attributes = {@Attribute(... some settings ...)}, 
        logicalExpressions = {
          @AND(attributes = {@Attribute(...), @Attribute(...)})
        })
  }
  private String value;

}

我知道我在上面的注释定义中定义的继承是不可能的。但是我怎样才能考虑我的注释和,或者在一个“家庭”中?

1 个答案:

答案 0 :(得分:5)

请检查Why it is not possible to extends annotations in java?

但是您可以创建可以在注释上使用的元注释来创建注释组。

    @LogicalExpression
@interface OR {
    Attribute[] attributes() default {};
    LogicalExpression logicalExpressions() default {};
}

但这对你的第二个问题没有帮助,即。使用LogicalExpression作为父母。

但你可以做类似下面的事情。将LogicExpression声明为enum这样您就可以使用单个enum和各种Attributes来执行条件。

e.g。如果您要执行ANDOR条件,则可以通过LogicExpression.ANDLogicExpression.OR并使用orAttributes()方法执行OR条件和{ {1}}执行andAttributes()条件

AND