diesen Fall vor:Ist Java garantiert String-Konstanten inline, wenn sie zum Zeitpunkt der Kompilierung bestimmt werden kann
public Class1 {
public static final String ONE = "ABC";
public static final String TWO = "DEF";
}
public Class2 {
public void someMethod() {
System.out.println(Class1.ONE + Class1.TWO);
}
}
Normalerweise würden Sie der Compiler erwarten, dass die ONE und TWO Konstanten Inline. Ist dieses Verhalten jedoch garantiert? Können Sie zur Laufzeit Class2 ohne Class1 im Klassenpfad bereitstellen und erwarten, dass es unabhängig von Compilern funktioniert, oder handelt es sich hierbei um eine optionale Compiler-Optimierung?
EDIT: Warum in aller Welt tun dies? Nun, ich habe eine Konstante, die zwischen zwei Enden einer Anwendung geteilt wird (Client und Server über RMI), und es wäre in diesem speziellen Fall sehr praktisch, die Konstante auf eine Klasse zu setzen, die nur auf einer Seite dieser Teilung sein kann (wie es logisch derjenige ist, der diesen konstanten Wert besitzt), anstatt es in einer willkürlichen Konstantenklasse zu haben, nur weil es von beiden Seiten des Codes geteilt werden muss. Zur Kompilierungszeit ist alles ein Satz von Quelldateien, aber zum Zeitpunkt der Erstellung ist es durch das Paket geteilt.
Danke Jon, aber das ist nicht genau das, was ich meinte. "interniert" bedeutet, dass es nur eine Instanz gibt, aber Sie könnten immer noch einen NoClassDefError erhalten, wenn die Klasse zur Laufzeit fehlt, wenn sie vom Compiler nicht wirklich inline war. – Yishai
Vielleicht bin ich blind, aber wo sagt man das? – gshauger
@gshaugher: Welches bisschen? –