JavaRush /Blog Java /Random-FR /Initialisation à double accolade
Joysi
Niveau 41

Initialisation à double accolade

Publié dans le groupe Random-FR

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.
Initialisation double accolade - 1
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 bracel'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 bracel'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.

DoubleL'initialisation des accolades utilise la création d'une classe interne anonyme . Ce qui est initialement caché en surface, cependant, Double bracel'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:
  1. Réduire les lignes dans le code
  2. Création et initialisation en une seule expression.
Inconvénients :
  1. Création d'une classe anonyme cachée de vous.
  2. Ce qui nous coûte des frais supplémentaires pour son instance à chaque fois que nous l'utilisons.
  3. 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. Sauvez le chaton

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 ArrayListconstructeur 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 ArrayListde - , 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 Setles autres collections, vous devrez donc la créer Listavant 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 Factoryles méthodes de sortie dans une collectionList :
List<String> list = Collections.unmodifiableList(Stream.of("abc", "bcd", "cde").collect(toList()));
Car Setvous 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 collectles 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, HashSetet 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 bracel'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 Listje préfère créer Collectionsen combinant avec créer Array.asListdans 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).
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION