method java compile-time-constant

method - static int java



Diferencia entre variables finales y constante de tiempo de compilaciĆ³n. (5)

¿Cuál es la diferencia entre las variables finales y las constantes de tiempo de compilación?

Considere el siguiente código

final int a = 5; final int b; b=6; int x=0; switch(x) { case a: //no error case b: //compiler error }

¿Qué significa esto? ¿Cuándo y cómo se asigna un valor a las variables finales? ¿Qué sucede en tiempo de ejecución y qué sucede en tiempo de compilación? ¿Por qué deberíamos dar una constante de tiempo de compilación? ¿Qué otras estructuras de Java exigen una constante de tiempo de compilación?


¿Qué significa esto?

Significa que ''b'' no es una expresión constante de tiempo de compilación, y el JLS requiere que lo sea.

¿Cuándo y cómo se asigna un valor a las variables finales?

Formalmente, cuando se ejecuta la instrucción de asignación o el inicializador.

Pero en la práctica, si la versión final declara una constante de tiempo de compilación, la expresión se evalúa en el momento de la compilación y su valor está incluido en el código.

¿Qué sucede en tiempo de ejecución y qué sucede en tiempo de compilación?

Véase más arriba.

¿Por qué deberíamos dar una constante de tiempo de compilación?

Porque el JLS lo requiere .

Es necesario que el compilador de bytecode compruebe que la instrucción switch está bien formada; Es decir, que los valores de las constantes de conmutación no chocan. También permite que el compilador JIT genere código optimizado para los valores reales de las constantes del switch.

¿Qué otras estructuras de Java exigen una constante de tiempo de compilación?

Nada de lo que pueda pensar, fuera de mi cabeza.


Desde el punto de vista del compilador, está intentando usar una variable b que podría no estar inicializada . La instrucción de conmutación se compila en el conmutador de tablas de código de bytes JVM o el interruptor de búsqueda que requiere que los valores utilizados en la declaración de caso sean constantes de tiempo de compilación y sean únicos.

final int a = 4; // compiler is sure a is initialized final int b;// variable b is not guranted to be assigned

p.ej. Aunque esta sentencia finalmente inicializará b, pero el compilador no puede detectarla.

if (a < 4) b= 10; if (a >= 4) b = 8


El problema es que todos los case: declaraciones deben ser definitivas en el momento de la compilación. Su primera declaración es definitiva . a voluntad para el 100% no será otro valor que 5 .

final int a = 5;

Sin embargo, esto no está garantizado para b . ¿Qué pasaría si hubiera una declaración if alrededor de b ?

final int b; if(something()) b=6; else b=5;


La instrucción switch necesita una constante. Como las variables finales se pueden inicializar con retraso y el compilador no puede determinar para b que tiene un valor en la rama del caso.


final int b; se puede asignar una vez y el valor no es seguro, se decidirá en tiempo de ejecución según las condiciones. esa es la razón, incluso si es una variable final , no es una constante de TIEMPO DE COMPILACIÓN, aunque será una constante de TIEMPO DE EJECUCIÓN y el caso necesita constantes de tiempo de compilación.