Lo spazio dei commenti è troppo piccolo, quindi ecco alcune ulteriori informazioni sull'uso di static final
. Come ho detto nel mio commento allo Andrzej's answer, solo le primitive e String
sono compilate direttamente nel codice come valori letterali.Per dimostrare questo, provare quanto segue:
È possibile vedere in azione con la creazione di tre classi (in file separati):
public class DisplayValue {
private String value;
public DisplayValue(String value) {
this.value = value;
}
public String toString() {
return value;
}
}
public class Constants {
public static final int INT_VALUE = 0;
public static final DisplayValue VALUE = new DisplayValue("A");
}
public class Test {
public static void main(String[] args) {
System.out.println("Int = " + Constants.INT_VALUE);
System.out.println("Value = " + Constants.VALUE);
}
}
compilare questi ed eseguire test, che stampa:
Int = 0
Value = A
Ora, modificare Constants
per avere un valore diverso per ciascuna e compilare semplicemente la classe Constants
. Quando si esegue nuovamente Test
(senza ricompilare il file di classe) viene comunque stampato il vecchio valore per INT_VALUE
ma non VALUE
. Per esempio:
public class Constants {
public static final int INT_VALUE = 2;
public static final DisplayValue VALUE = new DisplayValue("X");
}
Esegui test senza ricompilare Test.java
:
Int = 0
Value = X
Nota che qualsiasi altro tipo utilizzato con static final
è mantenuto come riferimento.
simili C/C++ #if
/#endif
, una costante letterale o una definita attraverso static final
con primitive, utilizzato in un normale Java if
condizione e valuta per false
causerà il compilatore di spogliare il codice byte per le istruzioni all'interno del if
blocco (non verranno generati).
private static final boolean DEBUG = false;
if (DEBUG) {
...code here...
}
Il codice di "... codice qui ..." non verrà compilato nel codice byte. Ma se hai cambiato DEBUG
a true
allora sarebbe.
fonte
2009-12-18 09:44:18
Nel moderno C++ si dovrebbe usare una costante tipizzata piuttosto che una #define per quello –
Sì, #define è in stile C. In C++ usa invece const. Vedi il libro "Effective C++" di Scott Meyers, voce 1. – Jabba