Le annotazioni estendibili aggiungerebbero effettivamente l'onere di specificare e mantenere un altro sistema di tipi. E questo sarebbe un sistema di tipo abbastanza unico, quindi non potresti semplicemente applicare un paradigma di tipo OO.
Rifletti su tutti i problemi quando introduci il polimorfismo e l'ereditarietà in un'annotazione (ad es. Cosa succede quando l'annotazione secondaria modifica le specifiche dell'annotazione come la conservazione?)
E tutta questa complessità aggiunta per quale caso d'uso?
Vuoi sapere se una determinata annotazione appartiene a una categoria?
Prova questo:
@Target(ElementType.ANNOTATION_TYPE)
public @interface Category {
String category();
}
@Category(category="validator")
public @interface MyFooBarValidator {
}
Come puoi vedere, puoi facilmente raggruppare e classificare le annotazioni senza indebito dolore utilizzando le strutture fornite.
Quindi, KISS è la ragione per non introdurre un sistema di tipo meta-tipo nel linguaggio Java.
[modifica ps]
Ho usato la stringa semplicemente per dimostrazione e in vista di una meta annotazione aperta. Per il tuo progetto, puoi ovviamente usare un enum di tipi di categoria e specificare più categorie ("eredità multipla") per una data annotazione. Si noti che i valori sono completamente fasulli e solo a scopo dimostrativo:
@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
, vale a dire qualsiasi annotazione èinstanceof
anche se questo fatto non è esplicitamente dichiarato.