Ich bin gespannt, wie die static
final
Felder von der JVM behandelt werden. Ich sah eine ähnliche Frage here, aber es ist nicht das, was ich suche. Lassen Sie uns solches Beispiel betrachten:letzte statische vs endgültige nicht statische Felder und JVM-Optimierung
public class TestClassX {
public final int CODE_A = 132;
public final int CODE_B = 948;
public final int CODE_C = 288;
// some other code
}
public class TestClassY {
public static final int CODE_A = 132;
public static final int CODE_B = 948;
public static final int CODE_C = 288;
// some other code
}
In TestClassX
Felder, wie sie final
sind und nicht geändert werden können, müssen die gleichen Werte in allen Instanzen der TestClassX
Klasse. Natürlich kann ich nicht schreiben TestClassX.CODE_A
aber ich kann sagen, dass diese Werte tatsächlich für alle Instanzen gemeinsam sind - ich bin sicher, dass jede Instanz ein CODE_A
Feld mit dem Wert 132
hat. In der TestClassY
kann ich die Syntax TestClassY.CODE_A
verwenden, aber auf den ersten Blick ist es nur einfacher für einen Entwickler, der sieht "Oh, diese Werte sind für alle Instanzen üblich".
Meine Hauptfrage: Ich denke, dass JVM, bei TestClassX
, verwendet keine zusätzlichen Speicher für final
Felder jedes Mal, wenn eine neue Instanz erstellt wird. Macht es? Macht JVM in diesem Fall eine Optimierung und welche Art von Optimierung ist das?
Extra Frage 1) Ich bin mir auch sicher, dass mir hier etwas sehr Wichtiges fehlt, was die Ursache meiner Zweifel ist. Was ist das?
Zusätzliche Frage 2) Btw. Wie kann ich einen Blick darauf werfen, wie mein Java-Quellcode nach der JVM-Optimierung aussieht (damit ich in Zukunft darauf zurückgreifen kann;))? Unterstützt eine IDE eine solche Funktionalität? IntelliJ zum Beispiel? Ich möchte einfach sehen, wie JVM meine TestClassX
und TestClassY
behandelt.
verwandte - javac inlines immer konstant Instanzvariablen, wahrscheinlich einen Fehler :) - https://groups.google.com/forum/#!topic/java-lang-fans/AyS3UqX4lj4 – ZhongYu
2) Die Optimierungen JVM aren nicht auf eine Weise gemacht, die sich als Java-Quelle ausdrückt. Compiler optimieren eine interne Darstellung dessen, was der Code * tut *.Quellen-> Quellenoptimierer existieren normalerweise nur für Sprachen, die bei jeder Verwendung kompiliert werden müssen (z. B. Javascript). Ihr tatsächliches Ziel sollte hier durch einen Blick auf den Java-Byte-Code oder den Asm, der sich aus dem JIT-Kompilieren für eine bestimmte CPU ergibt, abgedeckt werden. (Oder traditionelle Vor-Kompilierung für Java-Implementierungen wie gcj.) –