Java final (keyword)

final (keyword)

Java kennt das Schlüsselwort final. Trotz der Ähnlichkeit zum Schlüsselwort const in C++ gibt es feine Unterschiede. Wir schauen uns hier die Bedeutung von final in Java an.

Das Schlüsselwort final legt in Java fest, daß sich die damit deklarierte Referenz nicht ändern darf.
Wichtig: damit wird nichts über das referenzierte Objekt ausgesagt.
Anders gesagt: das referenzierte Objekt darf, soweit das die zugrunde liegende Klasse zulässt, in seinen Eigenschaften beliebig geändert werden, nur wird die mit final deklarierte Referenz immer auf das selbe Objekt zeigen.

Objekte mancher Klassen in Java sind von sich aus unveränderlich, zum Beispiel Strings und alle Datentypen-Kapselklassen wie Integer, Long, Float und so weiter. Einmal erzeugte Objekte dieser Java-Klassen sind nicht mehr änderbar. Wohl aber können Referenzen auf solche Objekte, falls sie nicht final sind, während der Laufzeit eines Java-Programms auf unterschiedliche Objekte zeigen.

Bedeutung von final in Java: Beispiel

Folgende Bespiele illustrieren den Sachverhalt, was final bedeutet:


    String x = "Hallo";
    String y = "Welt";
    x = y;
    System.out.println(x); // ergibt: "Welt"

Anderes Beispiel:

    String x = "Hallo";
    [... irgendwelcher x-beliebige Programmcode ...]
    irgendEineFunktion(x); // kann mit dem übergebenen String machen, was sie will
    [... irgendwelcher x-beliebige Programmcode ...]
    System.out.println(x); // ergibt garantiert immer: "Hallo", egal was dazwischen passiert, auch egal was in irgendEineFunktion passiert

Und nun ein Beispiel mit final:

    final Map map = new HashMap();
    map.put("Hallo", "Welt");
    System.out.println(map); // ein Eintrag wird ausgegeben
    map.put("Hello", "World");
    System.out.println(map); // beide Einträge werden ausgegeben

Man sieht: das Schlüsselwort final verhindert nicht, daß ein Objekt verändert wird. Es verhindert lediglich, daß die Referenz geändert wird. In obigem Beispiel würde folgende Programmzeile zu einem Compilefehler führen, weil (und nur weil) map als final deklariert ist:

    map = new HashMap(); // eine neue map zuweisen: geht nicht, weil map final ist.

Triviales

Ein Programm wird sein Verhalten durch Herausnehmen mancher oder aller final-Deklarationen niemals verändern.
Ebenso wird ein Programm sein Verhalten durch Einfügen von final-Deklarationen nicht ändern - wohl aber kann es dabei zu Compilefehlern kommen.

Und genau darin liegt der Sinn: final verhindert, daß eine Referenz aus Versehen geändert wird, denn genau dieses würde einen Compilefehler erzeugen.

Insofern hilft final einfach nur, einen sicheren Programmierstiel zu unterstützen. Ich habe mir angewöhnt, alle Variablen, wenn möglich, als final zu deklarieren. Das verhindert, daß ich die Referenzen aus Versehen ändere. Und wenn ich die Referenzen absichtlich ändere, erinnert mich die entstehende Fehlermeldung daran, daß ich nochmal prüfen sollte, ob ich vielleicht an anderer Stelle auf die Unveränderlichkeit dieser Variablen aufbaue. Wenn ja, wäre das eine Fehlerquelle, die ich ohne die Deklaration mit final nicht gefunden hätte.



Nach oben, Inhaltsverzeichnis, Impressum Admin: Artikel editieren