Java Language Annotations répétées


Exemple

Jusqu'à Java 8, deux instances de la même annotation ne pouvaient pas être appliquées à un seul élément. La solution de contournement standard consistait à utiliser une annotation de conteneur contenant un tableau d'une autre annotation:

// Author.java
@Retention(RetentionPolicy.RUNTIME)
public @interface Author {
    String value();
}

// Authors.java
@Retention(RetentionPolicy.RUNTIME)
public @interface Authors {
    Author[] value();
}

// Test.java
@Authors({
    @Author("Mary"),
    @Author("Sam")
})
public class Test {
    public static void main(String[] args) {
        Author[] authors = Test.class.getAnnotation(Authors.class).value();
        for (Author author : authors) {
            System.out.println(author.value());
            // Output:
            // Mary
            // Sam
        }
    }
}
Java SE 8

Java 8 fournit un moyen plus propre et plus transparent d'utiliser les annotations de conteneur, en utilisant l'annotation @Repeatable . Tout d'abord, nous ajoutons ceci à la classe Author :

@Repeatable(Authors.class)

Ceci indique à Java de traiter plusieurs annotations @Author comme si elles étaient entourées par le conteneur @Authors . Nous pouvons également utiliser Class.getAnnotationsByType() pour accéder au tableau @Author par sa propre classe, plutôt que par son conteneur:

@Author("Mary")
@Author("Sam")
public class Test {
    public static void main(String[] args) {
        Author[] authors = Test.class.getAnnotationsByType(Author.class);
        for (Author author : authors) {
            System.out.println(author.value());
            // Output:
            // Mary
            // Sam
        }
    }
}