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 String
werden 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 Constants
für jede Klasse einen anderen Wert zu haben, und kompilieren Sie einfach die Klasse Constants
. Wenn Sie Test
erneut ausführen (ohne die Klassendatei neu zu kompilieren), wird weiterhin der alte Wert für gedruckt, INT_VALUE
jedoch 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 final
wird, als Referenz beibehalten wird.
Ähnlich wie bei C / C ++ #if
/ #endif
führt ein konstantes oder static final
mit Primitiven definiertes Literal , das in einer regulären Java- if
Bedingung verwendet und ausgewertet wird, false
dazu, dass der Compiler den Bytecode für die Anweisungen innerhalb des if
Blocks 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 DEBUG
zu true
dann wechseln würden, wäre es.