java tomcat

Java If(falso) Compilar



jradiobutton (5)

Estoy desarrollando un proyecto web dinámico usando Tomcat. Es útil tener una bandera global que es lo único que tengo que cambiar entre mis servidores de desarrollo y despliegue. El mayor uso de la bandera es con declaraciones impresas.

public class Debug { public final static boolean DEVEL = true; public static void print(String message){ if(DEVEL){ System.out.println(message); } } }

Mi pregunta es si Java compilará las declaraciones impresas. es decir, si la etiqueta de desarrollo es falsa, los mensajes obviamente no se imprimirán, pero se incluirán en los archivos de clase (desarrollo es final). Esta es una cuestión de eficiencia. Escuché que el compilador de Java es muy inteligente, pero se dará cuenta de esto.


Si quiere que el compilador no lo compile, use esto:

public final static boolean DEVEL = Math.random() > -1;

El compilador no sabrá que esto es siempre true . (por supuesto use < -1 para false )

Encuentro este truco útil cuando quieres eliminar el código temporalmente sin que el compilador se queje sobre el código muerto, por ejemplo:

void myMethod() { // temporarily exit early if (Math.random() > -1) return; // usual code }


use el atributo ''final'' (como lo hizo), y compilará el código:

public static final boolean DEVEL = false;

Puede verificar agrupando el archivo de clase resultante para una cadena que aparecería solo si el código se compiló.


Nunca he visto que el compilador elimine código como este, sin embargo, el JIT eliminará efectivamente el código que nunca se ejecuta. Afirmaciones es un caso de uso común para esto. Todavía puede haber un costo nocional, pero en general uno que no vale la pena preocuparse. es decir, menos de 1 nano-segundo.


El costo puede ser mayor si el método toString () del mensaje es costoso. El método toString de una consulta sql grande en una instrucción preparada provocó un desbordamiento del montón debido a esta línea. Por lo tanto, el estándar no lo eliminó.


Eche un vistazo a este artículo:

http://www.javaworld.com/javaworld/jw-03-2000/jw-03-javaperf_4.html

El código que ha presentado se denomina "código muerto" por lo que no se incluirá en el archivo de clase compilado si establece DEVEL en falso, no se incluirá en el bytecode.

Además, verifica el comando

javap -c

para ver el bytecode resultante de tu clase.