2013-04-09 10 views
5

Chciałbym napisać kod rozwiązywania problemów, który mogę łatwo usunąć z późniejszych wersji innych niż debugowanie mojego programu. Wpadłem na:Jak inteligentna jest Java, jeśli instrukcje z ostatecznymi zmiennymi

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

Czy Java jest wystarczająco inteligentna, aby usunąć instrukcję if z końcowego kodu bajtowego, jeśli debug == false?

Czy istnieje lepsza praktyka, aby osiągnąć cel, jakim jest utrzymanie kodu debugowania w ostatecznej wersji programu?

+0

czy sprawdziłeś kod bajtowy? – PermGenError

+2

Wygląda na to, że powinno być łatwe do przetestowania - skompiluj, a następnie użyj javap, aby zobaczyć kod bajtowy. (Spodziewałbym się, że będzie to zoptymalizowane przez JIT, a nie javac). –

+0

Czy naprawdę warto ją zoptymalizować (test) za pomocą zmiennej końcowej? Zwykle używa się struktury rejestrowania, a następnie zapisuje instrukcje takie jak 'if (log.isDebugEnabled()) log.debug (" bla "+ x);'. Test jest wykonywany za każdym razem, ale '' blah "+ x 'nie jest oceniany. –

Odpowiedz

5

Zobacz końcówkę Java language specification chapter 14.21. Unreachable Statements dla opisu if(false):

if (false) { x=3; } 

nie powoduje błąd kompilacji. Optymalizacji kompilator może sobie sprawę, że oświadczenie x=3; nigdy nie zostanie zrealizowany i może wybrać pominąć kod dla tego oświadczenia z wygenerowanego pliku klasy, ale oświadczenie x=3; nie jest uważany za „nieosiągalny” w technicznym znaczeniu określonym tutaj .

Uzasadnieniem dla takiego zróżnicowanego traktowania jest umożliwienie programistom określenie „zmienne flaga”, takie jak:

static final boolean DEBUG = false; 

a następnie napisać kod takich jak:

if (DEBUG) { x=3; } 

Chodzi o to, że to powinna istnieć możliwość zmiany wartości DEBUG z false na true lub z true na false, a następnie poprawnie skompilować kod , bez żadnych innych zmian w tekście programu.

tl; dr; Zależy od kompilatora, czy instrukcje wewnątrz, jeśli są pominięte w kodzie bajtowym.

+0

Nieosiągalne wyciągi! Nie myślałem, żeby sprawdzić to po imieniu. Dziękuję Ci ! –