que - tipos de declaraciones de variables en java
DeclaraciĆ³n e inicializaciĆ³n de variables dentro de los conmutadores Java (3)
Tengo una pregunta loca sobre los conmutadores de Java.
int key = 2;
switch (key) {
case 1:
int value = 1;
break;
case 2:
value = 2;
System.out.println(value);
break;
default:
break;
}
Escenario 1: cuando la key
es dos, imprime con éxito el valor como 2.
Escenario 2 - Cuando voy a comentar el value = 2
en el case 2:
grazna diciendo que el valor de la variable local puede no haberse inicializado .
Preguntas:
Escenario 1: Si el flujo de ejecución no va al case 1:
(cuando la key = 2
), ¿cómo sabe el tipo de la variable de valor como int
?
Escenario 2: si el compilador conoce el tipo de la variable de valor como int
, entonces debe haber accedido al int value = 1;
expresión en el case 1:
(Declaración e Inicialización). Entonces, ¿por qué sqawrk? Cuando voy a comentar value = 2
en el case 2:
diciendo que el valor de la variable local puede no haberse inicializado .
Las declaraciones se procesan en tiempo de compilación y no dependen del flujo de ejecución de su código. Dado que el
value
se declara dentro del alcance local del bloque de conmutadores, se puede usar en cualquier punto de ese bloque desde el punto de su declaración.
La variable ha sido declarada (como int), pero no inicializada (se le ha asignado un valor inicial). Piensa en la línea:
int value = 1;
Como:
int value;
value = 1;
La parte de int value
le dice al compilador en tiempo de compilación que usted tiene una variable llamada value que es un int. El value = 1
parte lo inicializa, pero eso ocurre en tiempo de ejecución, y no ocurre en absoluto si no se ingresa esa rama del interruptor.
Las declaraciones de cambio son extrañas en términos de alcance, básicamente. De la sección 6.3 de JLS :
El alcance de una declaración de variable local en un bloque (§14.4) es el resto del bloque en el que aparece la declaración, comenzando con su propio inicializador e incluyendo cualquier otro declarante a la derecha en la declaración de declaración de variable local.
En su caso, el case 2
está en el mismo bloque que el case 1
y aparece después, aunque el case 1
nunca se ejecutará ... por lo que la variable local está dentro del alcance y disponible para escribir a pesar de que lógicamente nunca "ejecuta" la declaración. (Una declaración no es realmente "ejecutable" aunque la inicialización sí lo es)
Si comenta el value = 2;
asignación, el compilador aún sabe a qué variable se refiere, pero no habrá pasado por ninguna ruta de ejecución que le asigna un valor, por lo que se obtiene un error como cuando intenta leer cualquier otro no- variable local definitivamente asignada.
Recomiendo encarecidamente que no utilice las variables locales declaradas en otros casos, ya que conduce a un código altamente confuso, como ya ha visto. Cuando introduzco variables locales en las declaraciones de cambio (que trato de hacer rara vez - los casos deben ser muy cortos, idealmente) Por lo general, prefiero introducir un nuevo alcance:
case 1: {
int value = 1;
...
break;
}
case 2: {
int value = 2;
...
break;
}
Yo creo que esto es más claro.