L'approccio che suggerisce che l'utilizzo della variabile booleana statica finale è il più vicino a quella caratteristica suggerita perché è addirittura ottimizzato dal compilatore. Se il flag è impostato su false, i bytecode contenuti nel blocco non vengono nemmeno generati.
Mi permetta di mostrare un esempio:
public class Optimized {
private static final boolean DEBUG = true;
public static void main(String[] args) {
if(DEBUG){
System.out.println("DEBUG enabled");
}
}
}
Questo genera il bytecode
public class Optimized {
public Optimized();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String DEBUG enabled
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
Ma se ci rivolgiamo la bandiera fuori ...
private static final boolean DEBUG = false;
I bytecode guardano come segue
public class Optimized {
public Optimized();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: return
}
Quindi, AFAIK, questo è il più vicino possibile ottenere una direttiva di precompilazione in Java.
fonte
2012-03-24 19:35:05
L'OP ha chiesto "c'è un modo per farlo in java? * (Che non sta definendo una variabile statica globale ..) *" –
Java non ha variabili globali ... quindi tecnicamente quel pilota è discutibile. –
Si potrebbe sostenere che i campi 'static final' sono l'equivalente delle variabili globali in es. C++ (almeno dal punto di vista dell'utilizzo) ... ma la tua interpretazione è confermata dall'accettazione dell'OP, quindi ottieni anche il mio +1 :-) –