Je pense que je ne comprends pas comment fonctionne la portée dans un boîtier de commutation.
Quelqu'un peut-il m'expliquer pourquoi le premier code ne se compile pas mais le second le fait?
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 ...
Je vais répéter ce que d'autres ont dit: la portée des variables dans chaque clause case
correspond à l'ensemble de l'instruction switch
. Vous pouvez cependant créer d'autres étendues 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 désormais compilé avec succès car la variable nommée str
dans chaque clause case
est dans sa propre portée.
La portée de la variable est l'ensemble de l'instruction switch
- tous les cas et par défaut, si inclus.
Voici quelques 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;
}
Vous semblez supposer que chaque case
est un bloc avec sa propre portée locale, comme si des blocs/else. Ce n'est pas.
Il est important de corriger cette erreur conceptuelle, car sinon vous finirez par tomber dans le piège fréquent d'oublier le break
à l'intérieur du case
Je pense que c'est une question valable, et l'hypothèse de portée pour la déclaration de cas est inévitable. Nous y ajuster parce que Java writer a rendu cela incorrect.
par exemple. Si l'instruction par défaut prend la première ligne dans sa portée, ce qui ne va pas avec les cas où la fin du cas est explicitement fermée par l'instruction break. D'où 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 pas imbriquée.
Plusieurs cas peuvent être exécutés dans une seule instruction switch. Alors..
La portée d'une variable existe entre les accolades du commutateur et les instructions if. Dans l'exemple de code 1, les accolades de commutateur entourent les deux déclarations des variables, ce qui entraînera une erreur du compilateur, car le nom à la liaison de variable aura déjà été effectué.
Dans l'autre exemple, c'est correct car les deux variables sont déclarées entre leurs accolades (portée).
Dans le premier cas, la portée de la déclaration String se trouve dans l'instruction switch, elle est donc affichée en double tandis que dans le second, la chaîne est placée entre accolades, ce qui limite la portée dans les conditions if/else, donc ce n'est pas une erreur dans le deuxième cas.