Alcance de la variable en una caja de interruptor

Creo que no entiendo cómo funciona el scope en una caja de conmutación.

¿Puede alguien explicarme por qué el primer código no se comstack pero el segundo sí?

Código 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; } 

Código 2:

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

¿Cómo es que el scope de la variable “str” ​​no está contenido en el Caso 1?

Si omito la statement del caso 1, la variable “str” ​​nunca se declara …

Repetiré lo que otros han dicho: el scope de las variables en cada cláusula de case corresponde a toda la statement de switch . Sin embargo, puede crear más ámbitos nesteds con llaves de la siguiente manera:

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

El código resultante ahora se comstackrá correctamente ya que la variable llamada str en cada cláusula de case encuentra en su propio ámbito.

El scope de la variable es toda la instrucción switch – todos los casos y por defecto, si están incluidos.

Aquí hay algunas otras opciones …

Opción 1:

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

Opcion 2:

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

Usted parece estar asumiendo que cada case es un bloque con su propio ámbito local, como bloques if / else. No es.

Es importante corregir este error conceptual, porque de lo contrario terminarás cayendo en la trampa frecuente de olvidar la break dentro del case

Creo que es una pregunta válida, y la suposición de scope para la determinación del caso es inevitable. Ajustándonos a él porque el escritor de Java ha hecho esto no correcto.

por ejemplo, si la instrucción por defecto toma la primera línea en su scope que lo que está mal en los casos en que el final del caso está explícitamente cerrado por la statement de interrupción. Por lo tanto, la statement en el caso 1: no debería estar disponible en el caso 2 y tiene un scope paralelo pero no nested.

Varios casos se pueden ejecutar en una sentencia switch. Asi que..

El scope de una variable existe entre las llaves del interruptor y las instrucciones if. En el Código de ejemplo 1, las llaves de interruptor encierran ambas declaraciones de las variables que causarán un error en el comstackdor ya que el enlace de nombre a variable ya se habrá realizado.

En el otro ejemplo, está bien porque ambas variables se declaran dentro de sus propias llaves (scope).

En el primer caso, el scope de la statement de cadena está dentro de la statement de conmutación, por lo tanto, se muestra como duplicada, mientras que en el segundo la cadena se encierra entre llaves, lo que limita el scope en las condiciones if / else, por lo tanto no es un error en el segundo caso