Wenn ich kompilieren:Javac Behandlung static final anders basierend auf Zuweisungsverfahren
public static final boolean FOO = false;
public static final void fooTest() {
if (FOO) {
System.out.println("gg");
}
}
ich eine leere Methode fooTest() {}
bekommen. Allerdings, wenn ich kompilieren:
static boolean isBar = false;
public static final boolean BAR = isBar;
public static final void fooTest() {
if (BAR) {
System.out.println("gg");
}
}
die if-Anweisung in der kompilierten Klassendatei enthalten ist. Bedeutet das, dass es in Java zwei verschiedene "Arten" von statischen finalen gibt, oder ist das nur eine Compiler-Optimierung?
Der Compiler kann Ausdrücke, die nur 'statische final'-Konstanten und Literalkonstanten enthalten, zur Kompilierzeit auswerten und bei Bedarf Optimierungen vornehmen. Der erste Ausdruck kann zur Kompilierzeit ausgewertet werden; das zweite kann nicht, weil es sich auf einen nicht endgültigen Ausdruck stützt. – dasblinkenlight
Das bedeutet nicht, dass die JIT-Bytecode-Kompilierung es natürlich belassen wird. –