Der Kommentarbereich ist zu klein, daher finden Sie hier weitere Informationen zur Verwendung von static final. Wie ich in meinem Kommentar zur Antwort von Andrzej sagte , nur primitiv und Stringwerden als Literale direkt in den Code kompiliert. Versuchen Sie Folgendes, um dies zu demonstrieren:
Sie können dies in Aktion sehen, indem Sie drei Klassen (in separaten Dateien) erstellen:
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);
}
}
Kompilieren Sie diese und führen Sie Test aus, der Folgendes druckt:
Int = 0
Value = A
Ändern Sie nun, um Constantsfür jede Klasse einen anderen Wert zu haben, und kompilieren Sie einfach die Klasse Constants. Wenn Sie Testerneut ausführen (ohne die Klassendatei neu zu kompilieren), wird weiterhin der alte Wert für gedruckt, INT_VALUEjedoch nicht VALUE. Zum Beispiel:
public class Constants {
public static final int INT_VALUE = 2;
public static final DisplayValue VALUE = new DisplayValue("X");
}
Führen Sie den Test aus, ohne ihn neu zu kompilieren Test.java:
Int = 0
Value = X
Beachten Sie, dass jeder andere Typ, der mit verwendet static finalwird, als Referenz beibehalten wird.
Ähnlich wie bei C / C ++ #if/ #endifführt ein konstantes oder static finalmit Primitiven definiertes Literal , das in einer regulären Java- ifBedingung verwendet und ausgewertet wird, falsedazu, dass der Compiler den Bytecode für die Anweisungen innerhalb des ifBlocks entfernt (sie werden nicht generiert).
private static final boolean DEBUG = false;
if (DEBUG) {
...code here...
}
Der Code unter "... Code hier ..." würde nicht in den Bytecode kompiliert. Aber wenn Sie DEBUGzu truedann wechseln würden, wäre es.