java - programacion - sentencia for
¿Por qué Java identifica el código inalcanzable solo en el caso de while loop? (4)
Con respecto al bucle for, creo que es solo que no es tan fácil de detectar como el uso de una constante false
dentro de un ciclo while.
Con respecto al if
, esa fue una elección deliberada de autorizarlo para poder eliminar el código de depuración del código de bytes en el momento de la compilación:
private static final boolean DEBUG = false; // or true
...
if (DEBUG) {
...
}
Esta pregunta ya tiene una respuesta aquí:
Si tengo código como
public static void main(String args[]){
int x = 0;
while (false) { x=3; } //will not compile
}
el compilador denunciará que x=3
es un código inalcanzable, pero si tengo un código como
public static void main(String args[]){
int x = 0;
if (false) { x=3; }
for( int i = 0; i< 0; i++) x = 3;
}
luego se compila correctamente a través del código dentro de la if statement
y for loop
es inalcanzable. ¿Por qué esta lógica de flujo de trabajo java no detecta esta redundancia? ¿Cualquier uso?
Tal como se describe en la Especificación del lenguaje Java , esta función está reservada para la "compilación condicional".
Un ejemplo, descrito en el JLS, es que puede tener una constante
static final boolean DEBUG = false;
y el código que usa esta constante
if (DEBUG) { x=3; }
La idea es proporcionar la posibilidad de cambiar DEBUG
de true
a false
fácilmente sin realizar ningún otro cambio en el código, lo que no sería posible si el código anterior generara un error de compilación.
if (falso) {x = 3; } no da como resultado un error en tiempo de compilación. Un compilador de optimización puede darse cuenta de que la declaración x = 3; nunca se ejecutará y puede optar por omitir el código para esa declaración del archivo de clase generado, pero la instrucción x = 3; no se considera "inalcanzable" en el sentido técnico especificado aquí.
La razón de este tratamiento diferente es permitirles a los programadores definir "variables de bandera" tales como:
static boolean final DEBUG = false; y luego escribe un código como:
if (DEBUG) {x = 3; } La idea es que debería ser posible cambiar el valor de DEPURACIÓN de falso a verdadero o de verdadero a falso y luego compilar el código correctamente sin ningún otro cambio en el texto del programa.
El caso de uso con la condición if es la depuración. AFAIK está explícitamente permitido por la especificación para if
-statements (not for loop) para permitir código como este:
class A {
final boolean debug = false;
void foo() {
if (debug) {
System.out.println("bar!");
}
...
}
}
Más tarde (o mediante el depurador en tiempo de ejecución) puede cambiar el valor de debug
para obtener resultados.
EDITAR Como Christian señaló en su comentario, una respuesta que enlaza con la especificación se puede encontrar aquí .