多个注解

Multiple annotations

由于不可能在同一个目标上有重复的注释,我正在研究解决方法。我需要的可能是:

@Parent(sex="F", name="Alice")
@Parent(sex="M", name="Bob")
@Sibling(sex="M", name="Charlie")
@Sibling(sex="M", name="Dan")
@Sibling(sex="F", name="Eve")

我已经添加了另一个注释 @Relatives 来包含它们,将值成员声明为 Relative 注释的数组。

@Relatives({
    @Parent(sex="F", name="Alice")
    @Parent(sex="M", name="Bob")
    @Sibling(sex="M", name="Charlie")
    @Sibling(sex="M", name="Dan")
    @Sibling(sex="F", name="Eve")
})

但是我不能定义这样的数组,因为@Parent 和@Sibling @interfaces 不能扩展任何@Relative 超类。

除了定义两个不同的数组 Sibling[] siblings 和 Parent[] parents 之外,还有其他方法吗?但这会产生类似

的东西
@Relatives(
    parents={
        @Parent(sex="F", name="Alice"),
        @Parent(sex="M", name="Bob")
    }
    siblings={
        @Sibling(sex="M", name="Charlie")
        @Sibling(sex="M", name="Dan")
        @Sibling(sex="F", name="Eve")
   }
)

在 1.8 中,您有一个半生不熟的可重复注释方式,请参阅 java.lang.annotation.Repeatable 诀窍是您仍然需要声明您的 @Parents 和 @Siblings,但是:

  1. 使用时,包含的注解可以省略

  2. 在扫描(内省)它们时,在这种情况下,您会在它们包含的注释(@Parents@Siblings)中找到可重复的注释。

    public @interface Parents {
      Parent[] value();
    }

    // this says: will be repeated inside a `Parents` nest
    @Repeatable(Parents.class) 
    public @interface Parent {
      String name();

      String sex() default "F";
    }

那么你可以

@Parent(sex="F", name="Alice"),
@Parent(sex="M", name="Bob")
Child firstChild;

另见 "Repeating Annotations" on Oracles site