2009-08-27 5 views
41

Wenn ich ein boolesches Feld wie:Java Preprocessor

private static final boolean DEBUG = false;

und in meinen Code Ich habe Aussagen wie:

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

wird der Java-Präprozessor nur von der loszuwerden, wenn Aussage und der unerreichbare Code?

+2

"Die Java-Sprache hat keinen Präprozessor" (http://java.sun.com/developer/JDCTechTips/2003/tt0408.html) Sprechen Sie über den Java Compiler? –

+0

Danke für den Artikel, ich wusste nicht, dass Java keinen Präprozessor hat. Ich spreche nur über den Compiler. – twolfe18

+0

Es stimmt, dass Java keinen Präprozessor mit den gleichen Fähigkeiten wie C/C++ hat. Es verfügt jedoch über Annotationsprozessoren, die Kompilierungsverarbeitung bieten. Siehe [Oracle's Annotations Tutorial] (http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html) – KomodoDave

Antwort

109

Die meisten Compiler werden die Aussage zu beseitigen. Zum Beispiel:

public class Test { 

    private static final boolean DEBUG = false; 

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

} 

Nachdem diese Klasse kompilieren, drucke ich dann eine Auflistung der erzeugten Anweisungen über den javap Befehl:

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 

    } 

Wie Sie sehen können, keine System.out.println! :)

+16

+1 für die Anleitung, wie Sie es selbst testen. – akf

+2

Ich habe auch überprüft, wenn Sie eine Aussage haben, die etwas wie 'if (DEBUG && condition_that_may_be_true) ...' ist, und wenn 'DEBUG' immer falsch ist, wird es abgeschnitten. – twolfe18

+1

+1 Modellantwort – butterchicken

12

Ja, der Java-Compiler eliminiert den kompilierten Code in if Blöcken, die durch Konstanten gesteuert werden. Dies ist ein akzeptabler Weg, um "Debug" -Code bedingt zu kompilieren, den Sie nicht in einen Produktions-Build einbeziehen möchten.

+0

Kannst du die Seite Java Language Specification angeben, auf der das steht? – Ralph

+3

@Ralph: Siehe [14.21 Unreachable Statements] (http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.21) für die Diskussion in der JLS. Das Bit über die 'if'-Anweisung befindet sich genau am Ende dieses Abschnitts. –

+1

Seite jetzt hier für jse7: http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21 und hier für jse5: http://docs.oracle.com /javase/specs/jls/se5.0/html/statements.html#14.21 –

Verwandte Themen