Initialisation Java Double Brace

1. Vue d'ensemble

Dans ce rapide tutoriel, nous montrerons comment les doubles accolades peuvent être utilisées pour créer et initialiser des objets dans une seule expression Java .

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 le montre l'exemple ci-dessus, nous procédons comme suit:

  1. Créer une instance de HashSet
  2. Ajouter des pays au HashSet
  3. Enfin, nous affirmons si le pays est présent dans le HashSet

3. Utilisation de la double accolade

Cependant, nous pouvons en fait combiner la création et l'initialisation dans une seule instruction; c'est là 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 étend HashSet
  2. Fournir un bloc d'initialisation d'instance qui appelle la méthode add et ajoute le nom du pays au HashSet
  3. Enfin, nous pouvons affirmer si le pays est présent dans le HashSet

4. Avantages de l'utilisation d'accolades doubles

L'utilisation d'accolades doubles présente quelques avantages simples:

  • Moins de lignes de code par rapport au mode natif de création et d'initialisation
  • 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 d'accolades doubles sont:

  • Manière obscure et peu connue de faire 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ée comme finale
  • Contient une référence masquée à l'instance englobante, ce qui peut provoquer des fuites de mémoire

C'est à cause de ces inconvénients que l'initialisation à double accolade est considérée comme un anti-pattern.

6. 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 notre ensemble :

@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 Java 9 Collections

De plus, Java 9 apportera un ensemble de méthodes d'usine utiles qui rendront ce qui suit possible:

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

Vous pouvez en savoir plus à ce sujet dans cet article.

7. Conclusion

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

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