java - Java 注释中的类型层次结构

标签 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;

}

我知道我在上面的注释定义中定义的那种继承方式是不可能的。但是我如何才能将我的注释 AND、OR 视为一个“家庭”呢?

最佳答案

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

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

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

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

但是您可以执行如下操作。将 LogicExpression 声明为 enum 这样您就可以使用单个 enum 和各种 Attributes 集来执行条件。

例如如果你想执行 AND, OR 条件那么你可以传递 LogicExpression.AND, LogicExpression.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 {};..
}

关于java - Java 注释中的类型层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12294247/

相关文章:

java - JetBrains Intellij IDEA 未显示 Java 模块。它只显示 Java 项目中的 Groovy

java - 传递 servlet 值列表

java - 使用 Java 配置和 Spring Security 3.2 的安全方法注释

java - 以下 XML 的 JAXB 注释

java - 在 String[][] 中执行搜索

java - 如何从 JsonUnit 获取断言结果?

cocoa - (Cocoa) 我可以同时进行子类化和委托(delegate)吗?

r - 在 R 中的访问器函数中使用 callNextMethod()

scala - 不可变类层次结构中的多态更新

java - 是否值得创建自定义注释来表明方法只是有助于提高可读性?