2013-04-09 14 views
5

Vorrei scrivere un codice di risoluzione dei problemi che posso facilmente rimuovere dalle versioni successive del debug non di debug. Mi si avvicinò con:Quanto è intelligente Java se affermazioni con variabili finali

final static boolean debug_on=true; 
... 
if (debug_on) { system.out.println() or logger.log(...) } 

è Java abbastanza intelligente per cadere il if dal bytecode finale, se il debug == false?

Esiste una pratica migliore per raggiungere l'obiettivo di mantenere il codice di debug fuori dalla versione finale di un programma?

+0

hai controllato il codice byte? – PermGenError

+2

Sembra che dovrebbe essere facile da testare, compilare e quindi usare javap per vedere il bytecode. (Mi aspetterei che sia ottimizzato dal JIT, non da javac) –

+0

Vale veramente la pena ottimizzare questo (il test) usando una variabile finale? Di solito, uno utilizza un framework di registrazione e quindi scrive istruzioni come 'if (log.isDebugEnabled()) log.debug (" blah "+ x);'. Il test viene eseguito ogni volta ma "blah" + x' non viene valutato. –

risposta

5

vedere la fine del Java language specification chapter 14.21. Unreachable Statements per una descrizione di if(false):

if (false) { x=3; } 

non risulta in un errore di compilazione. Un compilatore ottimizzato può rendersi conto che la dichiarazione x=3; non verrà mai eseguito e può scegliere di omettere il codice per quella dichiarazione dal file di classe generata, ma la dichiarazione x=3; non è considerata come "irraggiungibile" nella tecnica senso specificato qui .

Il razionale di questo diverso trattamento è quello di consentire ai programmatori di definiscono "variabili flag" quali:

static final boolean DEBUG = false; 

e poi scrivere codice come:

if (DEBUG) { x=3; } 

L'idea è che si dovrebbe essere possibile modificare il valore di DEBUG da falso a vero o da vero a falso e quindi compilare il codice correttamente senza altre modifiche al testo del programma.

tl; dr; Dipende dal compilatore se le istruzioni all'interno del tuo se sono omesse nel bytecode.

+0

Dichiarazioni irraggiungibili! Non pensavo di cercarlo con quel nome. Grazie ! –

Problemi correlati