Question

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<PExp> copy = new ArrayList<PExp>(node.getArgs());
    for(PExp e : copy)
    {
        e.apply(this);
    }
}
outAMethodExp(node);

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

Était-ce utile?

La solution

Le seul but des accolades supplémentaires est de fournir une limite de portée. Le List<PExp> copy existera uniquement à l'intérieur de ces accolades et n'aura aucune portée en dehors d'eux.

Si ceci est du code généré, je suppose que le générateur de code le fait pour pouvoir insérer du code (tel que celui-ci) sans avoir à se soucier du nombre de fois où il a inséré un <=> et sans avoir à s'inquiéter éventuellement renommer les variables si cet extrait est inséré plusieurs fois dans la même méthode.

Autres conseils

J'approuve ce que matt b a écrit, et j'ajouterai qu'une autre utilisation des accolades anonymes que j'ai constatée consiste à déclarer un constructeur implicite dans des classes anonymes. Par exemple:

  List<String> names = new ArrayList<String>() {
    // 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 porté cette syntaxe à un autre niveau, ce qui permet à certaines choses lisses qui semblent totalement incompatibles de fonctionner. Etant donné qu’ils paraissent inconnus, je ne suis pas un grand fan moi-même, mais il vaut la peine de reconnaître au moins ce qui se passe si vous rencontrez cet usage.

Je suis d'accord avec la réponse à la limite de portée, mais j'ajouterais une chose.

Parfois, vous voyez une telle construction dans le code des personnes qui aiment plier des sections de leur code et qui ont des éditeurs qui plient les accolades automatiquement. Ils l'utilisent pour replier leur code en sections logiques qui ne font pas partie d'une fonction, d'une classe, d'une boucle, etc. normalement pliées.

En fait, je suppose que quelqu'un a oublié une autre déclaration.

Il existe rarement une bonne raison de se préoccuper de créer des portées de bloc 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 plutôt que d'avoir fait quelque chose d'intelligent.

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

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

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

Mais vous pouvez écrire

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

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

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

Comme remarque intéressante: les accolades permettent en réalité une classe d'instructions: les déclarations.

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

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

Je pense qu'ils définissent simplement un niveau de portée non nommé.

L'option apporter une étendue, copie ne sera pas visible en dehors de celle-ci, vous pourrez donc déclarer une autre variable portant le même nom ultérieurement. Et il peut être recueilli par le ramasse-miettes juste après que vous ayez quitté cette étendue. Dans ce cas, la copie sert de variable temporaire. Il s'agit donc d'un bon exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top