2008-05-15

Konstanten in Java

In diesem Weblog-Eintrag möchte ich mich mit einem nur scheinbar banalen Thema befassen. Auf die Frage, wie man in Java Konstanten definiert, wird mancher schnell mit einem 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.

No comments:

Post a Comment