Sprache: Java-
Version: 12.0.2
String-Quellcode wie folgt:
/* @implNote
* The actual value for this field is injected by JVM. The static
* initialization block is used to set the value here to communicate
* that this static final field is not statically foldable, and to
* avoid any possible circular dependency during vm initialization.
*/
static final boolean COMPACT_STRINGS;
static {
COMPACT_STRINGS = true;
}
So verstehen Sie diesen Satz: 'Der statische Initialisierungsblock wird verwendet, um den Wert hier festzulegen, um zu kommunizieren, dass dieses statische Endfeld nicht statisch faltbar ist, und um mögliche zirkuläre Abhängigkeiten während der VM-Initialisierung zu vermeiden.'
Antworten:
Dies ist ein Implementierungshinweis für JVM-Implementierer. Es ist nicht Teil der öffentlichen Dokumentation und kein Problem für Entwickler, die es verwenden
java.lang.String
.Aber wenn Sie wissen wollen:
Stellen Sie sich vor, sie hätten geschrieben:
Dann wäre es eine Konstante gewesen, dass der Compiler sie
true
überallCOMPACT_STRINGS
dort durch den Wert ersetzen könnte, wo sie verwendet wurde (nur imjava.lang
Paket, da es sich um eine paketlokale Variable mit Gültigkeitsbereich handelt).Durch die Angabe des Werts
true
in einem statischen Initialisierer weiß der Compiler nicht mehr, dass es sich um eine Konstante handelt, und der gesamte Code, der sie verwendet, muss den tatsächlichen Wert zur Laufzeit nachschlagen.In diesem Fall ist dies nützlich, da die JVM diesen Wert zur Laufzeit ändert (obwohl
final
die JVM ihn dennoch ändern kann), wie im Implementierungshinweis erwähnt.quelle
even though it's final, the JVM can still change it
warum JVM ihn ändern kann? Ich war verwirrt darüber, wie JVM es schafft, konstante Variablen zu ändern.