ネストするアノテーション
.NETの場合、特定のターゲット(型、プロパティ、メソッド等)に対して同一のアノテーション(カスタム属性)を複数記述することが可能だが、Javaはそれは許可されない(コンパイルレベルでチェックされる)。
Javaも今後のバージョンではアノテーションの記述の制約が緩やかになるらしいが、それまでは.NETと同様に同一のアノテーションを複数記述するのはできないとものだと思っていた。
//.NETはOK [Hoge] [Hoge] public class BarClass {} //Javaはコンパイルエラー @Hoge @Hoge × public class BarClass { }
しかし、記述したいアノテーションを集約された属性にしてしまえば(アノテーションの属性をアノテーションにするのに制約は無い)複数記述するのと同じだよな。
- Hoge.java
@Documented @Inherited @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Hoge { HogeChild[] HogeChildren() default {}; }
- HogeChild.java
@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 { 〜 }
これで複数記述するのと同じじゃないか!!!。
と今頃気づく愚かな自分をネタにしてみた。