Rozszerzalne adnotacje spowodowałyby dodatkowe obciążenie związane z określeniem i utrzymaniem innego systemu typów. Byłby to dość unikalny system typów, więc nie można po prostu zastosować paradygmatu typu OO.
Pomyśl przez wszystkie kwestie, gdy wprowadzi polimorfizm i dziedziczenie do adnotacji (na przykład, co się dzieje, gdy sub-adnotacja zmienia specyfikację meta-adnotacji, takich jak zatrzymywanie?)
A wszystko to dodane złożoność za to, co użytkowej przypadku ?
Chcesz się dowiedzieć, 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 grupę i kategoryzować adnotacje bez zbędnego bólu za pomocą dostarczonego udogodnienia.
Tak więc, KISS jest powodem niewprowadzania systemu typu meta do języka Java.
[p.s. edytuj]
Użyłem Stringa po prostu dla demonstracji iz uwagi na metatag otwarty meta. W przypadku danego projektu można oczywiście użyć wyliczenia kategorii i określić wiele kategorii ("dziedziczenie wielokrotne") do danej adnotacji. Należy pamiętać, że wartości te są całkowicie fałszywe i wyłącznie w celach 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 {
}
Uwaga, BTW, że wszystkie adnotacje rozszerzają "java.lang.annotation.Annotation", tj. Każda adnotacja to 'instanceof', chociaż ten fakt nie jest jawnie zadeklarowany. –