.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 {
〜
}
これで複数記述するのと同じじゃないか!!!。
と今頃気づく愚かな自分をネタにしてみた。