Java注解中的类型层次结构

5

我遇到了一些在注解中创建元数据结构的问题。我们使用注解来定义特殊属性以适用于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;

}

我知道在注释定义中以这种方式继承是不可能的。但是我如何将我的注释AND和OR视为同一“家族”?

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 {};..
}

很遗憾,这对我没有帮助。我需要通过一些通用的LogicalExpression列表来定义结构,但是使用特定的AND、OR、NOT或其他表达式。 - Jan Stanicek
更新了答案,我认为这绝对能满足你的需求。 - Amit Deshpande
这是一个不错的想法,但是这个解决方案仍然有其自身的限制。不过你的解决方案给了我另一个想法——我可以用 NODE 形式来实现它。Node 将包含应用于当前级别的逻辑表达式类型、属性列表和子节点列表。 - Jan Stanicek
但是现在我意识到子节点存在递归依赖关系,导致出现了“检测到循环:注释类型Node不能包含注释类型本身的属性”的问题。因此,这仍然不是最终解决方案。我希望能有一些简单的解决方法。 - Jan Stanicek
不,我不是那个意思,我的意思是你可以用你的代码添加另一个答案。 :) - Amit Deshpande
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接