Was bedeutet 'immutable'?

Immutable bedeutet auf deutsch unveränderlich. Wenn ein Objekt in Java immutable ist, ist es nicht modifizierbar. Mehr oder weniger zumindest.

Was das genau bedeutet soll dieser Artikel verdeutlichen.

Inhaltsverzeichnis

Imutablity durch final

Das Keyword final verändert Variablen in der Hinsicht, dass diese nur ein mal zugewiesen werden können. final macht also nicht ein Objekt unveränderlich, sondern eine Variable "nicht mehr neu zuweisbar". Mit der Methode werden in Java Konstanten definiert:

public static final CONSTANT_VALUE = "Beer";

Werden Variablen von primitiven Datentypen oder von vornherein immutable Typen als final deklariert, sind diese nicht mehr änderbar.

final int fixedValue = 42;
final String fixedString = "Loncium";

Imutability von Objekten

Objekte gelten dann als immutable, also unveränderlich, wenn auf alle Felder nur lesend zugegriggen werden kann. Ein Beispiel ist die hier schon mehrfach verwendete Klasse Person:

public class Person{
    private String firstName;
    private String lastName;

    public Person(String firstName, String lastName){
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }
}

Objekte der Klasse Person sind deswegen unveränderlich, weil auf die einzelnen Felder nur lesend zugegriffen werden kann. Die Klasse ermöglicht es allerdings, vererbt zu werden, wodurch die Getter überschrieben und Setter hinzugefügt werden können.

public class MutablePerson extends Person {
    private String firstName;
    private String lastName;

    public MutablePerson(String firstName, String lastName) {
       super(firstName, lastName);
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

Somit können Variablen vom Typ Person veränderliche Objekte vom Typ MutablePerson zugewiesen werden, obwohl man davon ausgehen würde, dass Person-Objekte immutable sind:

Person p = new MutablePerson("Johann", "Meier");

Eine Möglichkeit, dies zu verhindern, ist die Klasse Person selbst final zu machen. dadurch sind keine Ableitungen durch andere Klassen mehr erlaubt. Von einer final Klasse kann nicht geerbt werden:

public final class Person{
    // …  Properties und Getter
}

Ein Versuch von dieser Klasse zu erben würde in einem Compiler-Fehler resultieren.

Das Problem mit mutable Properties

Wenn einzelne Felder oder Properties von einem veränderlichen, also mutable Typ sind, ist das Objekt im Ganzen wieder nicht unveränderlich.


Ähnliche Artikel