Que signifient les accolades en Java par elles-mêmes?

J’ai du code Java qui utilise des accolades de deux manières

// Curly braces attached to an 'if' statement: if(node.getId() != null) { node.getId().apply(this); } // Curly braces by themselves: { List copy = new ArrayList(node.getArgs()); for(PExp e : copy) { e.apply(this); } } outAMethodExp(node); 

Que signifient ces accolades isolées après la première déclaration if ?

Le seul but des accolades supplémentaires est de fournir une limite de scope. La List copy n’existera que dans ces accolades et n’aura aucune scope en dehors de celles-ci.

Si c’est du code généré, je suppose que le générateur de code fait cela pour qu’il puisse insérer du code (tel que celui-ci) sans avoir à se soucier du nombre de fois qu’il a inséré une List copy les variables si cet extrait est inséré plusieurs fois dans la même méthode.

J’appuie l’écriture de matt b et j’ajoute qu’une autre utilisation des accolades anonymes est de déclarer un constructeur implicite dans les classes anonymes. Par exemple:

  List names = new ArrayList() { // I want to initialize this ArrayList instace in-line, // but I can't define a constructor for an anonymous class: { add("Adam"); add("Eve"); } }; 

Certains frameworks de tests unitaires ont pris cette syntaxe à un autre niveau, ce qui permet à certains éléments lisses qui semblent totalement incompatibles de fonctionner. Comme ils ne sont pas familiers, je ne suis pas un grand fan moi-même, mais cela vaut la peine de reconnaître au moins ce qui se passe si vous rencontrez cette utilisation.

Je suis d’accord avec la réponse à la limite de scope, mais j’appendais une chose.

Parfois, vous voyez une construction comme celle-ci dans le code des personnes qui aiment plier des sections de leur code et qui ont des éditeurs qui plient automatiquement les accolades. Ils l’utilisent pour replier leur code dans des sections logiques qui ne tombent pas dans une fonction, une classe, une boucle, etc., qui seraient généralement repliées.

J’imagine que quelqu’un a oublié une autre déclaration.

Il y a rarement une bonne raison de s’embêter à créer des scopes supplémentaires. Dans ce cas, et dans la plupart des cas, il est beaucoup plus probable que quelqu’un ait oublié de taper sa déclaration de contrôle que de faire quelque chose de intelligent.

Ils font une scope intérieure. La variable déclarée à l’intérieur de ces accolades n’est pas visible en dehors d’elles. Cela s’applique également à C / C ++.

Les accolades sont également utiles pour réduire la scope des instructions switch / case.

 switch(foo) { case BAR: int i = ... ... case BAZ: int i = ... // error, "i" already defined in scope } 

Mais tu peux écrire

 switch(foo) { case BAR:{ int i = ... ... } case BAZ:{ int i = ... // OK } } 

Ils définissent une nouvelle étendue, ce qui signifie que tout ce qui est déclaré dans cette étendue n’est pas visible en dehors des accolades.

Comme une note intéressante: les accolades permettent en fait une classe d’instructions: déclarations.

Ceci est illégal: if(a) int f;

mais c’est légal: if(a) { int f; } if(a) { int f; }

Je pense qu’ils définissent simplement un niveau de scope non nommé.

L’apport d’une scope, la copie ne sera pas visible à l’extérieur de celle-ci, vous pouvez donc déclarer une autre variable avec le même nom plus tard. Et il peut être collecté par le ramasse-miettes juste après avoir quitté cette étendue. Dans ce cas, la copie sert de variable temporaire, c’est donc un bon exemple.

Il est également utilisé pour les blocs d’initialisation .