two - static variable java
caso de variable final en la instrucción switch (3)
El caso en las instrucciones de conmutación debe ser constantes en tiempo de compilación . El comando
final int b=2
asigna el valor de 2
a b
, justo en el momento de la compilación. Pero el siguiente comando asigna el valor de 2
a b
en tiempo de ejecución .
final int b;
b = 2;
Por lo tanto, el compilador se queja, cuando no puede encontrar una constante en uno de los casos de la instrucción switch
.
final int a = 1;
final int b;
b = 2;
final int x = 0;
switch (x) {
case a:break; // ok
case b:break; // compiler error: Constant expression required
}
/* COMPILER RESULT:
constant expression required
case b:break;
^
1 error
*/
¿Por qué estoy recibiendo este tipo de error? Si hubiera hecho final int b = 2
, todo funciona.
La variable final sin valor asignado se llama una variable en blanco. Una final en blanco solo se puede asignar una vez y se debe desasignar cuando se produce una asignación o una vez en el programa.
Para hacer esto, un compilador de Java ejecuta un análisis de flujo para asegurar que, para cada asignación a una variable final en blanco, la variable esté definitivamente sin asignar antes de la asignación; de lo contrario se produce un error en tiempo de compilación
Es por eso que cuando el compilador compila la construcción del conmutador está lanzando la expresión constante requerida porque el valor de b es desconocido para el compilador.
b
posible que b
no se haya inicializado y se puedan asignar múltiples valores. En su ejemplo, obviamente está inicializado, pero probablemente el compilador no lo sepa (y no puede). Imagina:
final int b;
if (something) {
b = 1;
} else {
b = 2;
}
El compilador necesita una constante en el switch
, pero el valor de b
depende de alguna variable externa.