Quando compilo:javac trattando un statica finale diverso basato sul metodo di assegnazione
public static final boolean FOO = false;
public static final void fooTest() {
if (FOO) {
System.out.println("gg");
}
}
ottengo un metodo vuoto fooTest() {}
. Tuttavia quando compilo:
static boolean isBar = false;
public static final boolean BAR = isBar;
public static final void fooTest() {
if (BAR) {
System.out.println("gg");
}
}
l'istruzione if è inclusa nel file di classe compilato. Questo significa che ci sono due diversi "tipi" di final static in java, o si tratta solo di un'ottimizzazione del compilatore?
Il compilatore può valutare espressioni costituite solo da 'static final's e costanti letterali in fase di compilazione ed eseguire ottimizzazioni secondo necessità. La prima espressione può essere valutata in fase di compilazione; il secondo non può, perché si basa su un'espressione non finale. – dasblinkenlight
Ciò non significa che la compilazione bytecode JIT la lascerà naturalmente. –