4

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

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;

}

我知道以我在上面的注释定义中定义的那种方式继承是不可能的。但是我怎么能认为我的注释和,或者是在一个“家庭”中?

4

1 回答 1

5

请检查为什么不能在 java 中扩展注释?

但是您可以创建可用于注释的元注释以创建注释组。

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

但这不会帮助您解决第二个问题,即。用作LogicalExpression父母。

但是您可以执行以下操作。声明LogicExpressionenum 这样,您可以使用单个enum和不同的一组 Attributes来执行条件。

例如,如果你想执行ANDOR条件那么你可以通过LogicExpression.ANDLogicExpression.OR并使用orAttributes()方法来执行OR条件和andAttributes()执行AND条件

public enum LogicExpression {
OR,AND,NOT;
}


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface ComposedCondition {
LogicExpression[] getExpressions() default {};
Attributes[] orAttributes() default {};
   Attributes[] andAttributes() default {};..
}
于 2012-09-06T06:52:23.350 回答