2009-08-27 27 views
41

Si tengo un campo booleano como:Java preprocesador

private static final boolean DEBUG = false;

y dentro de mi código que tengo declaraciones como:

if(DEBUG) System.err.println("err1");

hace el preprocesador Java simplemente deshacerse del si declaración y el código inalcanzable?

+2

"El lenguaje Java no tiene preprocesador" (http://java.sun.com/developer/JDCTechTips/2003/tt0408.html) ¿Está hablando el compilador de Java? –

+0

Gracias por el artículo, no sabía que Java no tiene un preprocesador. Entonces, estoy hablando del compilador. – twolfe18

+0

Es cierto que Java no tiene un preprocesador con las mismas capacidades que C/C++. Sin embargo, tiene procesadores de anotación que ofrecen procesamiento en tiempo de compilación. Ver [Anotaciones Tutorial de Oracle] (http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html) – KomodoDave

Respuesta

109

mayoría de los compiladores eliminarán el comunicado. Por ejemplo:

public class Test { 

    private static final boolean DEBUG = false; 

    public static void main(String... args) { 
     if (DEBUG) { 
      System.out.println("Here I am"); 
     } 
    } 

} 

Después de compilar esta clase, a continuación, imprimir una lista de las instrucciones que se producen a través del comando javap:

javap -c Test 
    Compiled from "Test.java" 
    public class Test extends java.lang.Object{ 
    public Test(); 
     Code: 
     0: aload_0 
     1: invokespecial #1; //Method java/lang/Object."":()V 
     4: return 

    public static void main(java.lang.String[]); 
     Code: 
     0: return 

    } 

Como se puede ver, hay System.out.println! :)

+16

+1 para obtener instrucciones sobre cómo probarlo usted mismo. – akf

+2

también, verifiqué cuando tienes una declaración que es algo como 'if (DEBUG && condition_that_may_be_true) ...', y si 'DEBUG' es siempre falso lo corta. – twolfe18

+1

respuesta modelo +1 – butterchicken

12

Sí, el compilador Java eliminará el código compilado dentro if bloques que son controlados por las constantes. Esta es una forma aceptable de compilar condicionalmente el código de "depuración" que no desea incluir en una compilación de producción.

+0

¿Puedes dar la página de especificación del lenguaje Java que dice esto? – Ralph

+3

@Ralph: Ver [14.21 Declaraciones inalcanzables] (http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.21) para la discusión en el JLS. El bit sobre la declaración 'if' está cerca del final de esa sección. Página –

+1

ahora aquí para jse7: http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21 y aquí para jse5: http://docs.oracle.com /javase/specs/jls/se5.0/html/statements.html#14.21 –