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, vous ne pourriez donc pas simplement appliquer un paradigme de type OO.
Réfléchissez à tous les problèmes lorsque vous introduisez le polymorphisme et l'héritage dans une annotation (par exemple, que se passe-t-il lorsque la sous-annotation modifie les spécifications de méta-annotation telles que la rétention?)
Et toute cette complexité supplémentaire pour quel cas d'utilisation?
Vous voulez savoir si une annotation donnée appartient à une catégorie?
Essaye ça:
@Target(ElementType.ANNOTATION_TYPE)
public @interface Category {
String category();
}
@Category(category="validator")
public @interface MyFooBarValidator {
}
Comme vous pouvez le voir, vous pouvez facilement regrouper et classer les annotations sans douleur excessive en utilisant les fonctionnalités fournies.
Ainsi, KISS est la raison pour ne pas introduire un système de type méta-type dans le langage Java.
[ps modifier]
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. Notez que les valeurs sont entièrement fausses et à des fins de démonstration uniquement:
@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
, c'est-à-dire que toute annotation l'estinstanceof
bien que ce fait ne soit pas explicitement déclaré.