Rozszerzalne adnotacje skutecznie zwiększyłyby ciężar określania i utrzymywania innego systemu typów. Byłby to dość unikalny system typów, więc nie można po prostu zastosować paradygmatu typu OO.
Zastanów się nad wszystkimi problemami, gdy wprowadzasz polimorfizm i dziedziczenie adnotacji (np. Co się stanie, gdy subnotacja zmieni specyfikacje meta-adnotacji, takie jak retencja?)
A wszystko to dodatkowo komplikuje przypadek użycia?
Chcesz wiedzieć, czy dana adnotacja należy do kategorii?
Spróbuj tego:
@Target(ElementType.ANNOTATION_TYPE)
public @interface Category {
String category();
}
@Category(category="validator")
public @interface MyFooBarValidator {
}
Jak widać, można łatwo grupować i kategoryzować adnotacje bez zbędnego bólu, korzystając z udostępnionych udogodnień.
Tak więc KISS jest powodem, dla którego nie wprowadzono systemu typu meta-typ do języka Java.
[edycja ps]
Użyłem ciągu tylko do demonstracji i ze względu na otwartą meta adnotację. W przypadku własnego projektu możesz oczywiście użyć wyliczenia typów kategorii i podać wiele kategorii („wielokrotne dziedziczenie”) dla danej adnotacji. Pamiętaj, że wartości są całkowicie fałszywe i służą wyłącznie do celów demonstracyjnych:
@Target(ElementType.ANNOTATION_TYPE)
public @interface Category {
AnnotationCategory[] category();
}
public enum AnnotationCategory {
GENERAL,
SEMANTICS,
VALIDATION,
ETC
}
@Category(category={AnnotationCategory.GENERAL, AnnotationCategory.SEMANTICS})
public @interface FooBarAnnotation {
}
java.lang.annotation.Annotation
, tzn. Każda adnotacjainstanceof
, chociaż fakt ten nie jest wyraźnie zadeklarowany.