1. Initialisation à double accolade
L'initialisation à l'aide de doubles accolades (
ci-après dénommée initialisation à double accolade ) est un outil Java permettant de créer des collections telles que des listes, des ensembles et des cartes simultanément avec leur déclaration.
Lorsque vous avez besoin de listes avec des éléments fixes, comme une liste de produits ou de devises supportés, déclarer la liste en même temps que son initialisation améliore la lisibilité du code. C'est pourquoi l'initialisation à double accolade gagne en popularité, car il n'existe pas d'autres méthodes standard pour créer des collections avec initialisation simultanée dans le code. Malheureusement, contrairement à d’autres langages de programmation, Java ne prend pas en charge les collections de littéraux. En raison de cette limitation, créer une liste non modifiable
avec même un petit nombre d'éléments nous oblige à écrire de nombreuses lignes de code sous forme d'appels répétés
add()
pour ajouter les éléments souhaités avec un emballage final :
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(3);
list.add(5);
list.add(7);
List<Integer> unmodifiableList = Collections.unmodifiableList(list);
Il s’agit d’une description inutilement redondante qui pourrait être simplifiée. Remplissons les listes statiques d'une manière qui nous convient, à savoir directement dans des blocs statiques lors de l'initialisation, ce pour quoi
Double brace
l'initialisation nous aidera, nous permettant de tout écrire sur une seule ligne :
List<Integer> list = Collections.unmodifiableList(new ArrayList<Integer>() {{
add(2);
add(3);
add(5);
}});
De même,
Double brace
l'initialisation va nous aider à remplir des valeurs et
HashMap
:
Map<Integer, String> intToString = new HashMap<Integer, String>(){{
put(1, "one");
put(2, "two");
put(3, "three");
}};
Tout cela a l'air si élégant, mais cela a ses inconvénients, qui font de l'initialisation à double accolade un anti-modèle. Nous les examinerons plus en détail dans le prochain chapitre.
Avantages et inconvénients de l’initialisation à double accolade.
Double
L'initialisation des accolades utilise la création d'une classe
interne anonyme . Ce qui est initialement caché en surface, cependant,
Double brace
l'initialisation crée une classe avec une initialisation supplémentaire de son instance à chaque fois que vous l'utilisez. De plus, une référence cachée à cette classe privée est utilisée, ce qui peut nous conduire à d'éventuelles fuites de mémoire. Vous ne pouvez pas non plus utiliser l'opérateur fantôme pour les génériques (opérateur diamant < >), car nous ne pouvons pas accéder à l'intérieur d'une classe anonyme.
(Du traducteur : Encore une fois plus en détail :
après la première { , une classe anonyme interne est créée, après la seconde, { l'initialisation se produit lors de la création d'une instance de la classe, dans laquelle nous avons accès aux champs et méthodes de l'externe ( par rapport à la classe anonyme).) |
Avantages:
- Réduire les lignes dans le code
- Création et initialisation en une seule expression.
Inconvénients :
- Création d'une classe anonyme cachée de vous.
- Ce qui nous coûte des frais supplémentaires pour son instance à chaque fois que nous l'utilisons.
- Chaque fois qu'une référence cachée à celui-ci est créée, ce qui peut entraîner des fuites de mémoire.
Verdict : En raison des inconvénients ci-dessus et de l'existence d'alternatives à la double accolade, l'initialisation est considérée comme un anti-modèle dans le monde Java.
Alternatives à l'initialisation à double accolade en Java
La bonne nouvelle est qu’il existe d’autres moyens d’atteindre les mêmes objectifs en Java. Nous pouvons implémenter en une seule ligne de code la création et l'initialisation d'une ArrayList à l'aide du constructeur Copy de la classe Collection comme indiqué ci-dessous :
List<Integer> list = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(2, 3, 5)));
Arrays.asList()
nous renverra une liste de longueur fixe transmise au
ArrayList
constructeur de copie. Gardez à l'esprit la différence entre les listes de longueur fixe renvoyées par
Arrays.asList()
et
Collections.unmodifiableList()
: vous ne pouvez pas ajouter ou supprimer des éléments
ArrayList
de - , mais vous pouvez modifier un élément par index en utilisant
set()
, ce que vous ne pouvez pas faire avec une liste renvoyée par
Collections.unmodifiableList()
. Si vous souhaitez obtenir une petite liste, c'est la meilleure méthode, même si elle sera moins transparente pour
Set
les autres collections, vous devrez donc la créer
List
avant de créer
Set
-a. Mais c'est toujours mieux que l'initialisation à double accolade, car dans ce cas, une classe anonyme interne supplémentaire n'est pas créée à chaque utilisation. Si vous utilisez Java 8, vous disposez d'une autre méthode alternative. L'API JDK 8 Stream vous aidera à créer de petites collections en combinant
Stream Factory
les méthodes de sortie dans une collection
List
:
List<String> list = Collections.unmodifiableList(Stream.of("abc", "bcd", "cde").collect(toList()));
Car
Set
vous pouvez utiliser
Collectors.toSet()
la méthode ci
Collectors.toList()
-dessous à la place :
Set<String> set = Collections.unmodifiableSet(Stream.of("abc", "bcd", "cde").collect(toSet()));
À propos,
Stream collect
les méthodes ne garantissent pas que les collections qu'elles génèrent soient protégées des modifications. Dans Java 8, les collections renvoyées (telles que -
ArrayList
,
HashSet
et
HashMap
) sont assez courantes (nous pouvons les modifier), mais ce fait pourrait être corrigé dans les futures versions du JDK. C'est tout pour l'instant sur
Double brace
l'initialisation en Java. Ce modèle est acceptable pour les tests et les démos, mais pas assez bon pour une utilisation en production. En raison de ses inconvénients inhérents, l'initialisation à double accolade est devenue un anti-modèle de nos jours, surtout compte tenu des alternatives disponibles. J'utilise moi-même encore cette construction pour initialiser des cartes statiques et c'est tout. Car
List
je préfère créer
Collections
en combinant avec créer
Array.asList
dans son constructeur. Et si j'utilise Java 8, une conception utilisant l'API Stream et
collect()
.
Articles connexes : Si vous avez apprécié ce didacticiel et souhaitez en savoir plus sur les modèles, les principes et les meilleures pratiques de programmation Java, vous pouvez également consulter les autres articles de notre
site .
Lecture recommandée : Si vous souhaitez en savoir plus sur les modèles et les meilleures pratiques, vous devriez lire
Effective Programming de Joshua Bloch , aucun livre ne peut le remplacer. Et si vous maîtrisez déjà Java et recherchez un livre sur les modèles de conception dont le style de présentation humoristique est intéressant et facile à lire, faites attention à
« Head First ». Modèles de conception" .
Du traducteur : j'ai délibérément fourni un lien vers le livre original de Bloch, car sa traduction en russe n'a pas abouti (par exemple, Builder = constructeur). |
Traduction de l'article Qu'est-ce que l'initialisation à double accolade en Java ? Exemple d'anti-modèle (publié en octobre 2015).
GO TO FULL VERSION