2009-08-27 10 views
41

Jeśli mam logiczną pola jak:Java Preprocessor

private static final boolean DEBUG = false;

iw moim kodu mam stwierdzenia typu:

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

ma preprocesor Java właśnie pozbyć się jeśli oświadczenie i nieosiągalny kod?

+2

"Język Java nie ma preprocesora" (http://java.sun.com/developer/JDCTechTips/2003/tt0408.html) Czy mówisz o kompilatorze Java? –

+0

Dzięki za artykuł, nie wiedziałem, że Java nie ma preprocesora. Więc mówię tylko o kompilatorze. – twolfe18

+0

To prawda, że ​​Java nie ma preprocesora z takimi samymi możliwościami jak C/C++. Jednak ma on procesory adnotacji, które oferują przetwarzanie w czasie kompilacji. Zobacz [Samouczek Adnotacji Oracle] (http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html) – KomodoDave

Odpowiedz

109

Większość kompilatorów wyeliminuje oświadczenie. Na przykład:

public class Test { 

    private static final boolean DEBUG = false; 

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

} 

Po kompilacji tej klasy, ja potem wydrukować listę produkowanych instrukcji poprzez komendę 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 

    } 

Jak widać, nie System.out.println! :)

+16

+1 za instrukcję, jak przetestować to sam. – akf

+2

również, sprawdziłem, gdy masz instrukcję, która jest podobna do 'if (DEBUG && condition_that_may_be_true) ...', a jeśli 'DEBUG' jest zawsze fałszywe, to go wycina. – twolfe18

+1

+1 odpowiedź modelu – butterchicken

12

Tak, kompilator Java zlikwiduje skompilowany kod w blokach if, które są kontrolowane przez stałe. Jest to akceptowalny sposób warunkowego kompilowania kodu "debugowania", którego nie chcesz dołączać do kompilacji produkcyjnej.

+0

Czy możesz podać stronę specyfikacji języka Java, która to stwierdza? – Ralph

+3

@Ralph: Zobacz [14.21 Nieosiągalne stwierdzenia] (http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.21) do dyskusji w JLS. Bit dotyczący instrukcji "if" znajduje się tuż przy końcu tej sekcji. –

+1

Strona teraz tutaj dla jse7: http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21 i tutaj dla jse5: http://docs.oracle.com /javase/specs/jls/se5.0/html/statements.html#14.21 –