Declaración e inicialización de variables dentro de los conmutadores Java

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 comstackdor 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 de cambio son extrañas en términos de scope, básicamente. De la sección 6.3 de JLS :

El scope de una statement de variable local en un bloque (§14.4) es el rest del bloque en el que aparece la statement, comenzando con su propio inicializador e incluyendo cualquier otro declarante a la derecha en la statement de statement 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 scope y disponible para escribir a pesar de que lógicamente nunca “ejecuta” la statement. (Una statement no es realmente “ejecutable” aunque la inicialización sí lo es)

Si comenta el value = 2; asignación, el comstackdor 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 scope:

 case 1: { int value = 1; ... break; } case 2: { int value = 2; ... break; } 

Yo creo que esto es más claro.

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 comstackdor en tiempo de comstackció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 twig del interruptor.

De http://www.coderanch.com/t/447381/java-programmer-SCJP/certification/variable-initialization-within-case-block

Las declaraciones se procesan en tiempo de comstackción y no dependen del flujo de ejecución de su código. Dado que el value se declara dentro del scope local del bloque de conmutadores, se puede usar en cualquier punto de ese bloque desde el punto de su statement.