ネストするアノテーション

.NETの場合、特定のターゲット(型、プロパティ、メソッド等)に対して同一のアノテーション(カスタム属性)を複数記述することが可能だが、Javaはそれは許可されない(コンパイルレベルでチェックされる)。
Javaも今後のバージョンではアノテーションの記述の制約が緩やかになるらしいが、それまでは.NETと同様に同一のアノテーションを複数記述するのはできないとものだと思っていた。

//.NETはOK
[Hoge]
[Hoge]
public class BarClass 
{}
//Javaはコンパイルエラー
@Hoge
@Hoge × 
public class BarClass {
}

しかし、記述したいアノテーションを集約された属性にしてしまえば(アノテーションの属性をアノテーションにするのに制約は無い)複数記述するのと同じだよな。

@Documented
@Inherited
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Hoge {
    HogeChild[] HogeChildren() default {};
}
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface HogeChild {
    String PropertyName() default "";
    String TargetPropertyName() default "";
    boolean Ignore() default false;
}

記述する場合は子供のアノテーションを入れ子にして記述する。

@Hoge(HogeChildren=
    { @HogeChild(PropertyName="property1"), 
      @HogeChild(PropertyName="property2") })
public class FooClass extends AbstractFoo {
  〜
}

これで複数記述するのと同じじゃないか!!!。

と今頃気づく愚かな自分をネタにしてみた。