In diesem Post möchte ich mich mit einem nur scheinbar banalen Thema befassen. Auf die Frage, wie man in Java Konstanten definiert, wird mancher schnell mit

public static final int ANTWORT = 42;

antworten. In der Tat scheitert jeder Versuch, ANTWORT einen Wert zuzuweisen, schon zur Compilezeit.

Weiter. Sehen Sie sich den folgenden Ausdruck an:

public static final String SEPARATOR = System.getProperty("file.separator");

Der Ausdruck ist, um auf die schon länger zurück liegende Frage eines Kollegen zu antworten, in einem Klassenrumpf übrigens zulässig. Auch in diesem Fall scheitert ein Zuweisungsversuch schon zur Compilezeit.

…noch ein Versuch…

public static final Date NOW = new Date();

…und im Anschluss…:

NOW.setTime(0l);

Hoppla…!

Dass sich dieser Ausdruck nicht nur klaglos übersetzen lässt, sondern auch zur Laufzeit keinen Fehler provoziert, mag zunächst verwundern. Wenn man sich etwas ausführlicher mit dem, was da passiert, auseinandersetzt, wird das Verhalten aber sehr schnell klar. Lassen Sie uns zunächst vergegenwärtigen, was der Modifier final eigentlich tut.

Auf Klassen- und Methodenebene schützt final also vor dem Überschreiben. Variablen werden unveränderlich. Ihr kann nur einmal ein Wert zugewiesen werden. Wichtig bei Referenztypen ist allerdings, dass sich diese Unveränderbarkeit nur auf die Referenz bezieht, nicht aber auf das referenzierte Objekt. Der Variable NOW kann also keine neue Instanz der Klasse Date zugewiesen werden, wohl aber können Klassen- oder Instanzvariablen der bereits erzeugten und zugewiesenen Instanz verändert werden.


This is a (slightly updated) repost of a piece I published on my blog Tommi’s Blog. I deleted the blog in the wake of the GDPR, so the original version is no longer available, or only through the WayBack Machine of the Internet Archive. Please note: code usually has not been updated, so language feature reflect the time the original post was written.