Анотації, що розширюються, ефективно додають тягар визначення та обслуговування іншої системи. І це була б досить унікальна система типу, тому ви не могли просто застосувати парадигму типу ОО.
Подумайте над усіма питаннями, коли ви вносите поліморфізм та успадкування до анотації (наприклад, що відбувається, коли суб-анотація змінює специфікації метаанотації, такі як утримання?)
І все це додало складності для того, який випадок використання?
Ви хочете знати, чи належить дана примітка до категорії?
Спробуйте це:
@Target(ElementType.ANNOTATION_TYPE)
public @interface Category {
String category();
}
@Category(category="validator")
public @interface MyFooBarValidator {
}
Як бачите, ви можете легко групувати та класифікувати анотації без зайвого болю за допомогою наданих засобів.
Отже, KISS є причиною невведення системи типу мета-типу до мови Java.
[ps редагувати]
Я використовував String просто для демонстрації та з огляду на відкриту мета-анотацію. Для власного даного проекту ви, очевидно, можете використовувати перелік типів категорій і вказати кілька категорій ("множинне спадкування") для даної анотації. Зауважте, що цінність є неправдивою і лише для демонстраційних цілей:
@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
, тобто будь-яка анотація є,instanceof
хоча цей факт прямо не зазначається.