353 votes

Qu'est-ce que l'initialisation de Double Brace en Java ?

Qu'est-ce que la syntaxe d'initialisation Double Brace ( {{ ... }} ) en Java ?

2 votes

2 votes

11 votes

L'initialisation en double accolade est une fonctionnalité très dangereuse et doit être utilisée judicieusement. Elle peut rompre les contrats d'égalité et introduire des fuites de mémoire délicates. Ce site L'article décrit les détails.

345voto

Brian Agnew Points 143181

L'initialisation en double accolade crée une classe anonyme dérivée de la classe spécifiée (l'attribut extérieur ), et fournit un bloc d'initialisation au sein de cette classe (l'élément intérieur accolades). Par exemple

new ArrayList<Integer>() {{
   add(1);
   add(2);
}};

Notez que l'utilisation de cette initialisation en double accolade a pour effet de créer des classes internes anonymes. La classe créée a une valeur implicite this pointeur vers la classe extérieure environnante. Bien que ce ne soit normalement pas un problème, cela peut causer des difficultés dans certaines circonstances, par exemple lors de la sérialisation ou du ramassage des déchets, et il vaut la peine d'en être conscient.

12 votes

Merci d'avoir clarifié la signification des accolades intérieures et extérieures. Je me suis demandé pourquoi il y a soudainement deux accolades autorisées avec une signification spéciale, alors qu'il s'agit en fait de constructions Java normales qui n'apparaissent que comme une nouvelle astuce magique. Ce genre de choses me fait remettre en question la syntaxe Java. Si vous n'êtes pas déjà un expert, elle peut être très difficile à lire et à écrire.

5 votes

Une "syntaxe magique" comme celle-ci existe dans de nombreux langages, par exemple presque tous les langages de type C supportent la syntaxe "va à 0" de "x --> 0" dans les boucles for qui est juste "x-- > 0" avec un placement bizarre des espaces.

21 votes

Nous pouvons simplement conclure que "l'initialisation de l'accolade double" n'existe pas en soi, c'est juste une combinaison de la création d'un classe anonyme et un bloc initialisateur qui, une fois combinés, regarde comme une construction syntaxique, mais en réalité, ce n'est pas le cas.

26voto

akuhn Points 12241

Pour une application amusante de l'initialisation des doubles accolades, voir ici Le tableau de Dwemthy en Java .

Un extrait

private static class IndustrialRaverMonkey
  extends Creature.Base {{
    life = 46;
    strength = 35;
    charisma = 91;
    weapon = 2;
  }}

private static class DwarvenAngel
  extends Creature.Base {{
    life = 540;
    strength = 6;
    charisma = 144;
    weapon = 50;
  }}

Et maintenant, soyez prêt pour le BattleOfGrottoOfSausageSmells et des morceaux de bacon !

4voto

dhblah Points 2337

Vous voulez dire quelque chose comme ça ?

List<String> blah = new ArrayList<String>(){{add("asdfa");add("bbb");}};

c'est une initialisation de la liste des tableaux au moment de la création (hack)

4voto

Anton Dozortsev Points 746

Vous pouvez mettre quelques instructions Java comme boucle pour initialiser la collection :

List<Character> characters = new ArrayList<Character>() {
    {
        for (char c = 'A'; c <= 'E'; c++) add(c);
    }
};

Random rnd = new Random();

List<Integer> integers = new ArrayList<Integer>() {
    {
         while (size() < 10) add(rnd.nextInt(1_000_000));
    }
};

Mais ce cas affecte les performances, vérifiez ceci discussion

4voto

miku Points 63392

C'est - entre autres - un raccourci pour initialiser les collections. En savoir plus ...

2 votes

C'est l'une de ses applications, mais ce n'est pas la seule.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X