Initialisation Java Double Brace

Initialisation Java Double Brace

1. Vue d'ensemble

Dans ce rapide didacticiel, nous allons montrer comment les doubles accolades peuvent être utilisées pour lescreating and initializing objects in a single Java expression.

Nous verrons également pourquoi cette technique peut être considérée comme un anti-pattern.

2. Approche standard

Normalement, nous initialisons et peuplons un ensemble de pays comme suit:

@Test
public void whenInitializeSetWithoutDoubleBraces_containsElements() {
    Set countries = new HashSet();
    countries.add("India");
    countries.add("USSR");
    countries.add("USA");

    assertTrue(countries.contains("India"));
}

Comme on peut le voir dans l'exemple ci-dessus, nous procédons comme suit:

  1. Créer une instance deHashSet

  2. Ajouter des pays auxHashSet

  3. Enfin, nous affirmons si le pays est présent dans leHashSet

3. Utilisation de la double accolade

Cependant, nous pouvons réellement combiner la création et l’initialisation en une seule instruction; c'est ici que nous utilisons des doubles accolades:

@Test
public void whenInitializeSetWithDoubleBraces_containsElements() {
    Set countries = new HashSet() {
        {
           add("India");
           add("USSR");
           add("USA");
        }
    };

    assertTrue(countries.contains("India"));
}

Comme on peut le voir dans l'exemple ci-dessus, nous sommes:

  1. Création d'une classe interne anonyme qui étendHashSet

  2. Fournir un bloc d'initialisation d'instance qui appelle la méthode add et ajoute le nom du pays auxHashSet

  3. Enfin, on peut affirmer si le pays est présent dans leHashSet

4. Avantages de l'utilisation d'accolades doubles

L'utilisation de doubles accolades présente des avantages simples:

  • Moins de lignes de code par rapport au mode de création et d'initialisation natif

  • Le code est plus lisible

  • L'initialisation de la création se fait dans la même expression

5. Inconvénients de l'utilisation d'accolades doubles

Les inconvénients de l'utilisation de doubles accolades sont les suivants:

  • Manière obscure et peu connue d'effectuer l'initialisation

  • Cela crée une classe supplémentaire chaque fois que nous l'utilisons

  • Ne prend pas en charge l’utilisation de «l’opérateur diamant» - une fonctionnalité introduite dans Java 7

  • Ne fonctionne pas si la classe que nous essayons d'étendre est marquéefinal

  • Contient une référence masquée à l'instance englobante, ce qui peut provoquer des fuites de mémoire

C’est en raison de ces inconvénients que l’initialisation des doubles accolades est considérée comme un anti-motif.

6. Des alternatives

6.1. Méthodes Stream Factory

Au lieu de cela, nous pouvons faire bon usage de la nouvelle API Java 8 Stream pour initialiser nosSet:

@Test
public void whenInitializeUnmodifiableSetWithDoubleBrace_containsElements() {
    Set countries = Stream.of("India", "USSR", "USA")
      .collect(collectingAndThen(toSet(), Collections::unmodifiableSet));

    assertTrue(countries.contains("India"));
}

6.2. Méthodes d'usine de collections Java 9

De plus, Java 9 apportera un ensemble de méthodes d’usine utiles qui permettront:

List list = List.of("India", "USSR", "USA");
Set set = Set.of("India", "USSR", "USA");

Vous pouvez en savoir plus sur cesin this article.

7. Conclusion

Dans ce didacticiel concis, nous avons discuté de l’utilisation des doubles accolades ainsi que de ses avantages et inconvénients.

L'implémentation de ces exemples peut être trouvée dans leGitHub project - il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.