Jeśli mam logiczną pola jak:Java Preprocessor
private static final boolean DEBUG = false;
iw moim kodu mam stwierdzenia typu:
if(DEBUG) System.err.println("err1");
ma preprocesor Java właśnie pozbyć się jeśli oświadczenie i nieosiągalny kod?
Jeśli mam logiczną pola jak:Java Preprocessor
private static final boolean DEBUG = false;
iw moim kodu mam stwierdzenia typu:
if(DEBUG) System.err.println("err1");
ma preprocesor Java właśnie pozbyć się jeśli oświadczenie i nieosiągalny kod?
Większość kompilatorów wyeliminuje oświadczenie. Na przykład:
public class Test {
private static final boolean DEBUG = false;
public static void main(String... args) {
if (DEBUG) {
System.out.println("Here I am");
}
}
}
Po kompilacji tej klasy, ja potem wydrukować listę produkowanych instrukcji poprzez komendę 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 }
Jak widać, nie System.out.println
! :)
+1 za instrukcję, jak przetestować to sam. – akf
również, sprawdziłem, gdy masz instrukcję, która jest podobna do 'if (DEBUG && condition_that_may_be_true) ...', a jeśli 'DEBUG' jest zawsze fałszywe, to go wycina. – twolfe18
+1 odpowiedź modelu – butterchicken
Tak, kompilator Java zlikwiduje skompilowany kod w blokach if
, które są kontrolowane przez stałe. Jest to akceptowalny sposób warunkowego kompilowania kodu "debugowania", którego nie chcesz dołączać do kompilacji produkcyjnej.
Czy możesz podać stronę specyfikacji języka Java, która to stwierdza? – Ralph
@Ralph: Zobacz [14.21 Nieosiągalne stwierdzenia] (http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.21) do dyskusji w JLS. Bit dotyczący instrukcji "if" znajduje się tuż przy końcu tej sekcji. –
Strona teraz tutaj dla jse7: http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21 i tutaj dla jse5: http://docs.oracle.com /javase/specs/jls/se5.0/html/statements.html#14.21 –
"Język Java nie ma preprocesora" (http://java.sun.com/developer/JDCTechTips/2003/tt0408.html) Czy mówisz o kompilatorze Java? –
Dzięki za artykuł, nie wiedziałem, że Java nie ma preprocesora. Więc mówię tylko o kompilatorze. – twolfe18
To prawda, że Java nie ma preprocesora z takimi samymi możliwościami jak C/C++. Jednak ma on procesory adnotacji, które oferują przetwarzanie w czasie kompilacji. Zobacz [Samouczek Adnotacji Oracle] (http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html) – KomodoDave