Zuletzt aktualisiert am 16.12.2025 5 Minuten Lesezeit

Immutability

Immutability (deutsch: Unveränderlichkeit) ist ein fundamentales Konzept in der Softwareentwicklung, bei dem Datenobjekte nach ihrer Erstellung nicht mehr verändert werden können. Statt ein bestehendes Objekt zu modifizieren, wird bei jeder Änderung eine neue Instanz mit den gewünschten Werten erstellt. Das ursprüngliche Objekt bleibt dabei unverändert erhalten.

Grundprinzip: Mutable vs. Immutable

Der Unterschied zwischen mutable (veränderlich) und immutable (unveränderlich) Objekten liegt in der Art, wie Änderungen behandelt werden:

Eigenschaft Mutable Objekte Immutable Objekte
Änderungen Direkt am Objekt (in-place) Neue Instanz wird erstellt
Referenz Bleibt gleich nach Änderung Neue Referenz bei Änderung
Beispiele (Java) ArrayList, HashMap String, Integer, LocalDate
Beispiele (JavaScript) Array, Object String, Number

Ein anschauliches Beispiel: Stell dir eine Schachtel mit Bausteinen vor. Bei mutable Objekten kannst du die Bausteine in der Schachtel direkt austauschen. Bei immutable Objekten musst du eine komplett neue Schachtel mit der gewünschten Bausteinekombination erstellen – die ursprüngliche Schachtel bleibt unverändert.

Codebeispiele

JavaScript: Mutable vs. Immutable

// MUTABLE: Array wird direkt verändert
const zahlen = [1, 2, 3];
zahlen.push(4);  // Verändert das Original-Array
console.log(zahlen);  // [1, 2, 3, 4]

// IMMUTABLE: Neues Array wird erstellt
const original = [1, 2, 3];
const erweitert = [...original, 4];  // Spread-Operator erstellt Kopie
console.log(original);   // [1, 2, 3] - unverändert!
console.log(erweitert);  // [1, 2, 3, 4]

Java: Immutable String

// Strings sind in Java immutable
String original = "Hallo";
String modifiziert = original.concat(" Welt");

System.out.println(original);     // "Hallo" - unverändert!
System.out.println(modifiziert);  // "Hallo Welt" - neues Objekt

Vorteile von Immutability

Thread-Safety

Immutable Objekte sind von Natur aus threadsicher. Da sich ihr Zustand nicht ändert, können mehrere Threads gleichzeitig auf sie zugreifen, ohne dass Synchronisationsmechanismen wie Locks benötigt werden. Das eliminiert Race Conditions und macht parallele Programmierung deutlich einfacher.

Vorhersagbarkeit und Debugging

Wenn Daten nicht verändert werden können, weisst du immer genau, welchen Wert ein Objekt hat. Du musst nicht den gesamten Programmfluss nachverfolgen, um herauszufinden, ob und wann ein Objekt modifiziert wurde. Das macht die Fehlersuche erheblich einfacher und den Code leichter nachvollziehbar.

Sicherheit durch Datenintegrität

Immutable Objekte schützen vor unbeabsichtigten Seiteneffekten. Wenn du ein Objekt an eine Funktion übergibst, kannst du sicher sein, dass die Funktion es nicht verändert. Das ist besonders wichtig bei der Arbeit in grösseren Teams oder mit externen Bibliotheken.

Immutability in der funktionalen Programmierung

Immutability ist ein Kernprinzip der funktionalen Programmierung. In funktionalen Sprachen wie Haskell, Clojure oder Scala sind Datenstrukturen standardmässig unveränderlich. Das ermöglicht referentielle Transparenz: Eine Funktion liefert bei gleichen Eingaben immer das gleiche Ergebnis, ohne Seiteneffekte zu verursachen.

Sogenannte Pure Functions (reine Funktionen) arbeiten ausschliesslich mit ihren Eingabeparametern und geben ein neues Ergebnis zurück, ohne externe Zustände zu verändern. Das macht sie besonders gut testbar und wiederverwendbar.

Immutability in React und Redux

Im modernen Frontend-Development mit React ist Immutability unverzichtbar. React verwendet Shallow Comparison (Referenzvergleich), um zu erkennen, ob sich der State geändert hat und ein Re-Render nötig ist.

// FALSCH: Direkte Mutation - React erkennt keine Änderung!
const [items, setItems] = useState(['A', 'B']);
items.push('C');  // Mutation
setItems(items);  // Gleiche Referenz = kein Re-Render

// RICHTIG: Immutable Update - React rendert neu
setItems([...items, 'C']);  // Neue Array-Referenz

Redux, die populäre State-Management-Bibliothek, basiert ebenfalls auf Immutability. Reducer müssen immer ein neues State-Objekt zurückgeben, niemals den bestehenden State mutieren. Tools wie Immer oder Redux Toolkit vereinfachen das Schreiben von immutable Updates.

Immutability in verschiedenen Sprachen

Sprache Immutable by Default Besonderheiten
Java Nein String, Wrapper-Klassen (Integer, etc.) sind immutable. final verhindert Reassignment
JavaScript Nein Primitive Typen immutable, Objekte/Arrays mutable. const verhindert nur Reassignment
Rust Ja Variablen sind standardmässig immutable, mut für Veränderlichkeit nötig
Scala Optional Unterscheidung zwischen val (immutable) und var (mutable)
Clojure Ja Alle Collections sind persistent und immutable
Python Nein Tupel sind immutable, Listen mutable

Performance-Überlegungen

Ein häufiger Einwand gegen Immutability ist der Speicherverbrauch: Wenn bei jeder Änderung ein neues Objekt erstellt wird, entstehen viele Kopien. Moderne Implementierungen lösen dieses Problem durch Structural Sharing (Strukturteilung).

Bei Structural Sharing werden unveränderte Teile einer Datenstruktur wiederverwendet. Nur die tatsächlich geänderten Pfade werden neu erstellt. Bibliotheken wie Immutable.js nutzen diese Technik, um effiziente immutable Datenstrukturen anzubieten.

In der Praxis überwiegen die Vorteile von Immutability meist die Performance-Kosten. Besonders bei lese-intensiven Anwendungen (die Mehrheit der Webapplikationen) ist der Overhead vernachlässigbar, während die Vorteile bei Wartbarkeit und Fehlerfreiheit erheblich sind.

Immutable Klassen in Java erstellen

Um eine eigene immutable Klasse in Java zu erstellen, beachte folgende Regeln:

// Immutable Klasse für einen Punkt
public final class Punkt {  // final verhindert Vererbung
    private final int x;   // final verhindert Änderung
    private final int y;

    public Punkt(int x, int y) {
        this.x = x;
        this.y = y;
    }

    // Nur Getter, keine Setter!
    public int getX() { return x; }
    public int getY() { return y; }

    // "Änderung" erstellt neues Objekt
    public Punkt verschieben(int dx, int dy) {
        return new Punkt(this.x + dx, this.y + dy);
    }
}

Immutability in der IT-Ausbildung

Das Verständnis von Immutability ist für IT-Azubis besonders wichtig, da es in vielen modernen Frameworks und Bibliotheken eine zentrale Rolle spielt. Ob React-Entwicklung, funktionale Programmierung oder Thread-sichere Anwendungen – wer Immutability versteht, kann besseren und sichereren Code schreiben.

Quellen und weiterführende Links