Zum Inhalt

Spaß mit Konstanten

Interessant finde ich die Erkenntnis, dass Konstanten, die aus einer anderen Klasse verwendet werden, nicht automatisch aktualisiert werden, wenn die andere Klasse neu kompiliert wird. Um dieses Verhalten zu verdeutlichen ein einfaches Beispiel bestehend aus zwei Klassen.

public class InternalLibrary{
    public final static String A_MESSAGE = "This is a test"; // 1
    // public final static String A_MESSAGE = "Changed message"; // 2   
}
public class ExternalProgram{
    public static void main(String[] args){
        System.out.println(InternalLibrary.A_MESSAGE);
    }
}

Kompiliert und führt man das Programm nun aus, so erhält man die folgenden Ausgaben:

X:\funwithconstants>javac InternalLibrary.java
X:\funwithconstants>javac ExternalProgram.java
X:\funwithconstants>java ExternalProgram
This is a test

Ändert man nun »InternalLibrary« so, dass »1« aus- und »2« einkommentiert ist und kompiliert im Anschluss nur die geänderte Klasse neu, so ist man doch überrascht, dass die Ausgabe anders als vielleicht erwartet aussieht.

X:\funwithconstants>javac InternalLibrary.java
X:\funwithconstants>java ExternalProgram
This is a test

Die Ursache hierfür ist, dass der Compiler, sobald er Konstanten entdeckt, diese während der Kompilierung durch die konkreten Werte ersetzt. Somit muss man bei der Verwendung von Konstanten die Klassen neu kompilieren, die auf diese Klassen zugreifen. Konkret:

X:\funwithconstants>javac ExternalProgram.java
X:\funwithconstants>java ExternalProgram
Changed message
Published inJava

Kommentare sind geschlossen.