104 votes

Portée de la variable dans un cas de switch

Je crois que je ne comprends pas comment la portée fonctionne dans un cas de switch.

Quelqu'un peut-il m'expliquer pourquoi le premier code ne compile pas mais le second oui ?

Code 1 :

 int key = 2;
 switch (key) {
 case 1:
      String str = "1";
      return str;
 case 2:
      String str = "2"; // duplicate declaration of "str" according to Eclipse.
      return str;
 }

Code 2 :

 int key = 2;
 if (key == 1) {
      String str = "1";
      return str;
 } else if (key == 2) {
      String str = "2";
      return str;
 }

Comment se fait-il que la portée de la variable "str" ne soit pas contenue dans le cas 1 ?

Si je saute la déclaration du cas 1, la variable "str" n'est jamais déclarée...

0 votes

203voto

Richard Cook Points 10763

Je vais répéter ce que d'autres ont dit : la portée des variables dans chaque case correspond à l'ensemble des switch déclaration. Vous pouvez toutefois créer d'autres portées imbriquées avec des accolades, comme suit :

int key = 2;
switch (key) {
case 1: {
    String str = "1";
    return str;
  }
case 2: {
    String str = "2";
    return str;
  }
}

Le code résultant sera maintenant compilé avec succès puisque la variable nommée str dans chaque case est dans sa propre portée.

9 votes

Écoutez ce type. Il a raison.

29 votes

C'est exact. Mais je serais très ennuyé par tout programmeur de mon équipe qui utilise cette "syntaxe" sans une TRÈS bonne raison. C'est une recette pour la confusion et les bugs. Elle cache visuellement le fait que le premier bloc de cas (s'il n'y avait pas l'élément return ) "continue" même après l'accolade fermante - et permet d'oublier le break .

3 votes

Également : utiliser break pour la maintenabilité et la prévention des bogues ! même si ce n'est pas nécessaire.

10voto

Drew Wills Points 4768

La portée de la variable est l'ensemble du switch déclaration -- tous les cas et le défaut, s'il est inclus.

Voici d'autres options...

Option 1 :

int key = 2;
switch (key) {
case 1:
     return "1";
case 2:
     return "2";
}

Option 2 :

int key = 2;
String str = null;
switch (key) {
case 1:
     str = "1";
     return str;
case 2:
     str = "2";
     return str;
}

9voto

leonbloy Points 27119

Vous semblez supposer que chaque case est un bloc avec sa propre portée locale, comme les blocs if/else. Ce n'est pas le cas.

Il est important de corriger cette erreur conceptuelle, car sinon vous finirez par tomber dans le piège fréquent de l'oubli du break à l'intérieur de la case

2voto

Sachin Kumar Points 11

Je pense que c'est une question valable, et que l'hypothèse de la portée de l'énoncé du cas est inévitable. S'y adapter parce que l'auteur de java a fait que ce n'est pas correct.

Par exemple, si l'instruction if prend par défaut la première ligne dans sa portée, qu'est-ce qui ne va pas avec les cas où la fin du cas est explicitement fermée par l'instruction break. Par conséquent, la déclaration dans le cas 1 : ne devrait pas être disponible dans le cas 2 et elle a une portée parallèle mais non imbriquée.

0voto

Stas Kurilin Points 5955

Plusieurs cas peuvent être exécutés dans une seule instruction de commutation. Alors

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