2010-06-17 7 views
7

Para mi sorpresa este código funciona bien:¿Cuándo se declaran las referencias en una instrucción switch?

int i = 2; 
switch(i) { 
case 1: 
    String myString = "foo"; 
    break; 
case 2: 
    myString = "poo"; 
    System.out.println(myString); 
} 

Pero la cadena de referencia nunca debe ser declarado? ¿Podría ser que todas las variables en cada caso siempre se declaran sin importar qué, o cómo se resuelve?

+1

¿No están todas las declaraciones hechas al principio del {...} bloque que las contiene? –

+0

Creo que Jules tiene razón. Java tiene ámbitos estáticos para que el flujo de control no influya en la creación (en oposición a la inicialización) de la variable. El lugar en la pila se asigna al ingresar al bloque de interruptores. Pero todavía es un poco curioso. GCC se niega a compilar el código C equivalente para la (creo) la misma razón por la que Java se niega a compilar 'if (someBool) String s =" foo ";' – musiKk

Respuesta

7

Bueno, se trata de corchetes (es decir, alcance).

es mejor la práctica, podría decirse que, para escribir sus declaraciones de este modo:

int i = 2; 
switch(i) { 
    case 1: { 
     String myString = "foo"; 
     break; 
    } 
    case 2: { 
     myString = "poo"; 
     System.out.println(myString); 
    } 
} 

(no estoy cerca de un compilador de Java en este momento, pero eso no debería compilar).

+0

¡Hoy aprendí algo nuevo! –

+2

De hecho, no compila. – musiKk

+0

@musikk: Gracias por confirmar, no es frecuente, estoy feliz de que algo no se compile :) –

3

El alcance de la declaración myString es el bloque de conmutadores (donde el {carácter es). Si tuviera que escribirlo así, la declaración sería por caso:

int i = 2; 
switch(i) { 
    case 1: { 
     String myString = "foo"; 
     break; 
    } 

    case 2: { 
     String myString = "poo"; 
     System.out.println(myString); 
    } 
} 
Cuestiones relacionadas