2009-08-27 17 views
41

Se ho un campo booleano come:Java preprocessore

private static final boolean DEBUG = false;

e all'interno del mio codice che ho affermazioni del tipo:

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

fa il preprocessore Java solo sbarazzarsi del caso dichiarazione e il codice irraggiungibile?

+2

"Il linguaggio Java non ha alcun preprocessore" (http://java.sun.com/developer/JDCTechTips/2003/tt0408.html) Stai parlando del compilatore Java? –

+0

Grazie per l'articolo, non sapevo che Java non avesse un preprocessore. Quindi sto solo parlando del compilatore. – twolfe18

+0

È vero che Java non ha un preprocessore con le stesse funzionalità di C/C++. Tuttavia ha processori di annotazione che offrono elaborazione in fase di compilazione. Vedi [Oracle's Annotations Tutorial] (http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html) – KomodoDave

risposta

109

La maggior parte dei compilatori eliminerà la dichiarazione. Per esempio:

public class Test { 

    private static final boolean DEBUG = false; 

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

} 

Dopo aver compilato questa classe, ho poi stampare un elenco delle istruzioni prodotte tramite il 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 

    } 

Come si può vedere, non System.out.println! :)

+16

+1 per le istruzioni su come testarlo da solo. – akf

+2

inoltre, ho controllato quando hai un'affermazione che è qualcosa come 'if (DEBUG && condition_that_may_be_true) ...', e se 'DEBUG' è sempre falso lo interrompe. – twolfe18

+1

Risposta modello +1 – butterchicken

12

Sì, il compilatore Java eliminerà il codice compilato all'interno dei blocchi if controllati da costanti. Questo è un modo accettabile per compilare in modo condizionale il codice "debug" che non si desidera includere in una build di produzione.

+0

Puoi fornire la pagina delle specifiche della lingua Java che lo afferma? – Ralph

+3

@ Ralph: vedere [14.21 Dichiarazioni irraggiungibili] (http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.21) per la discussione nel JLS. Il bit sull'istruzione 'if' è proprio vicino alla fine di quella sezione. –

+1

Pagina qui per jse7: http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21 e qui per jse5: http://docs.oracle.com /javase/specs/jls/se5.0/html/statements.html#14.21 –