© Abdoabdalla/Shutterstock.com
Java Magazin
Immutable Classes mittels Annotations generieren

Unveränderliche Werte

In der funktionalen Programmierung sind unveränderliche Daten ein unverzichtbares Werkzeug. Und auch Java hat in der Vergangenheit das eine oder andere funktionale Konzept adaptiert. Eine native Unterstützung für Unveränderlichkeit fehlt jedoch nach wie vor. Mit Hilfe geeigneter Drittbibliotheken lässt sich aber einiges erreichen. In diesem Artikel wollen wir daher die Generierung von unveränderlichen Klassen mit Hilfe der Bibliothek Immutables vorstellen.

Manuel Mauky


Unter unveränderlichen Daten versteht man Datenstrukturen, die nach dem initialen Anlegen nicht mehr verändert werden können. Einmal erzeugt, können nur noch Kopien abgeleitet, aber keine Daten mehr „in-place“ verändert werden. Dies hat verschiedene Vor- und Nachteile. In funktionalen Sprachen wird diese Eigenschaft u. a. dazu genutzt, ungewollte Seiteneffekte zu verhindern, denn eine Veränderung eines Werts außerhalb der Funktion wäre ein solcher Seiteneffekt. In Kombination mit einem funktionalen Programmierstil können unveränderliche Datenstrukturen die Lesbarkeit, Verständlichkeit und Testbarkeit von Code erhöhen, indem die Menge der möglichen Einflussfaktoren begrenzt wird. Unveränderbare Objekte können beispielsweise ohne Bedenken an fremde Methoden als Parameter übergeben werden, ohne dass man Angst haben muss, dass der Fremdcode das eigene Objekt unvorhergesehen manipuliert. Auch beim Thema Multithreading können unveränderliche Daten eine Erleichterung sein und viele Fehlerquellen von vornherein ausschließen.

Nachteilig kann sich das in manchen Situationen auf die Performance auswirken, da eben häufiger Kopien der Daten erzeugt werden müssen. Auch hierfür gibt es geeignete Hilfsmittel und Techniken zur Vermeidung von Problemen, die aber sicherlich nicht in jedem Anwendungsgebiet ausreichend sind. Letztlich ist also wie bei fast allen technischen Themen eine Abwägung nötig.

Hat man sich dann einmal für die funktionale Programmierung und Immutability entschieden, stellt sich die Frage der konkreten Umsetzung.

Java ist keine funktionale Sprache, bringt in der Standardbibliothek aber dennoch bereits ein paar unveränderliche Klassen mit, beispielsweise die Klassen aus dem neuen Date and Time API. Im Allgemeinen ist die Unterstützung für diesen Programmierstil in Java aber begrenzt.

Zwar können in Java Variablen als final markiert werden, das wirkt sich aber nur auf die Referenz selbst aus, sodass diese nicht mehr neu belegt werden kann. Über die Veränderbarkeit der Objekte selbst, auf die eine Referenz zeigt, sagt das final-Schlüsselwort nichts aus. Nur bei flachen Datentypen wie int, double oder boolean sorgt das Schlüsselwort effektiv für die Unveränderlichkeit des Werts.

Um unveränderliche Datenstrukturen nutzen zu können, müssen wir diese also entweder selbst implementieren oder aus entsprechenden Drittbibliotheken beziehen. Beispielsweise bringt die Bibliothek vavr [1] neben zahlreichen nützlichen funktionalen Helferlein auch einen Satz von unverände...

Java Magazin
Immutable Classes mittels Annotations generieren

Unveränderliche Werte

In der funktionalen Programmierung sind unveränderliche Daten ein unverzichtbares Werkzeug. Und auch Java hat in der Vergangenheit das eine oder andere funktionale Konzept adaptiert. Eine native Unterstützung für Unveränderlichkeit fehlt jedoch nach wie vor. Mit Hilfe geeigneter Drittbibliotheken lässt sich aber einiges erreichen. In diesem Artikel wollen wir daher die Generierung von unveränderlichen Klassen mit Hilfe der Bibliothek Immutables vorstellen.

Manuel Mauky


Unter unveränderlichen Daten versteht man Datenstrukturen, die nach dem initialen Anlegen nicht mehr verändert werden können. Einmal erzeugt, können nur noch Kopien abgeleitet, aber keine Daten mehr „in-place“ verändert werden. Dies hat verschiedene Vor- und Nachteile. In funktionalen Sprachen wird diese Eigenschaft u. a. dazu genutzt, ungewollte Seiteneffekte zu verhindern, denn eine Veränderung eines Werts außerhalb der Funktion wäre ein solcher Seiteneffekt. In Kombination mit einem funktionalen Programmierstil können unveränderliche Datenstrukturen die Lesbarkeit, Verständlichkeit und Testbarkeit von Code erhöhen, indem die Menge der möglichen Einflussfaktoren begrenzt wird. Unveränderbare Objekte können beispielsweise ohne Bedenken an fremde Methoden als Parameter übergeben werden, ohne dass man Angst haben muss, dass der Fremdcode das eigene Objekt unvorhergesehen manipuliert. Auch beim Thema Multithreading können unveränderliche Daten eine Erleichterung sein und viele Fehlerquellen von vornherein ausschließen.

Nachteilig kann sich das in manchen Situationen auf die Performance auswirken, da eben häufiger Kopien der Daten erzeugt werden müssen. Auch hierfür gibt es geeignete Hilfsmittel und Techniken zur Vermeidung von Problemen, die aber sicherlich nicht in jedem Anwendungsgebiet ausreichend sind. Letztlich ist also wie bei fast allen technischen Themen eine Abwägung nötig.

Hat man sich dann einmal für die funktionale Programmierung und Immutability entschieden, stellt sich die Frage der konkreten Umsetzung.

Java ist keine funktionale Sprache, bringt in der Standardbibliothek aber dennoch bereits ein paar unveränderliche Klassen mit, beispielsweise die Klassen aus dem neuen Date and Time API. Im Allgemeinen ist die Unterstützung für diesen Programmierstil in Java aber begrenzt.

Zwar können in Java Variablen als final markiert werden, das wirkt sich aber nur auf die Referenz selbst aus, sodass diese nicht mehr neu belegt werden kann. Über die Veränderbarkeit der Objekte selbst, auf die eine Referenz zeigt, sagt das final-Schlüsselwort nichts aus. Nur bei flachen Datentypen wie int, double oder boolean sorgt das Schlüsselwort effektiv für die Unveränderlichkeit des Werts.

Um unveränderliche Datenstrukturen nutzen zu können, müssen wir diese also entweder selbst implementieren oder aus entsprechenden Drittbibliotheken beziehen. Beispielsweise bringt die Bibliothek vavr [1] neben zahlreichen nützlichen funktionalen Helferlein auch einen Satz von unverände...

Neugierig geworden?


    
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang