Les annotations extensibles ajouteraient effectivement la charge de spécifier et de maintenir un autre type de système. Et ce serait un système de type assez unique, donc vous ne pourriez pas simplement appliquer un paradigme de type OO.
Pensez à tous les problèmes lorsque vous présentez polymorphisme et héritage à une annotation (par exemple ce qui se passe lorsque la sous-annotation change caractéristiques méta-annotations telles que la rétention?)
Et tout cela ajouté à la complexité de ce cas d'utilisation ?
Vous souhaitez savoir si une annotation donnée appartient à une catégorie?
Essayez ceci:
@Target(ElementType.ANNOTATION_TYPE)
public @interface Category {
String category();
}
@Category(category="validator")
public @interface MyFooBarValidator {
}
Comme vous pouvez le voir, vous pouvez facilement classer groupe et annotations sans douleur excessive à l'aide des équipements fournis. Donc, KISS est la raison de ne pas introduire un système de type méta-type au langage Java.
[p.s. edit]
J'ai utilisé la chaîne simplement pour la démonstration et en vue d'une méta-annotation ouverte. Pour votre propre projet, vous pouvez évidemment utiliser une énumération de types de catégories et spécifier plusieurs catégories («héritage multiple») pour une annotation donnée. Prenez note que les valeurs sont tout à fait faux et uniquement à des fins de démonstration:
@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 {
}
Notez, BTW, que toutes les annotations étendent 'java.lang.annotation.Annotation', c'est-à-dire que toute annotation est' instanceof' bien que ce fait ne soit pas explicitement déclaré. –