© StonePictures/Shutterstock.com
Kolumne: EnterpriseTales

Record-Type: Value Objects werden endlich Java-native


Value Objects sind einer der fundamentalen Building Blocks in Domain-driven Design. Sie in Java zu erstellen, erforderte bisher allerdings einigen Boilerplate-Code. Das ändert sich mit Java 15: Es wird ein neues Sprachkonstrukt eingeführt – und zwar die Records. Und diese erfüllen alle technischen Anforderungen zur einfachen Umsetzung von Value Objects.

Aus objektorientiertem Domain-driven Design kennen wir Value Objects (z. B. [1]). Sie stellen die Werte innerhalb der Domänenmodellierung dar: Sie haben im Gegensatz zu Entitäten keine Identität und können sich daher nicht über die Zeit hinweg verändern. Da Value Objects keine Identität haben, erfolgt der Vergleich zweier Value Objects immer über alle enthaltenen Werte. Sowohl aus logischer als auch aus technischer Sicht ergibt sich daraus, dass Value Objects unveränderlich, also immutable sind.

Genauso wie für Entitäten gilt auch für Value Objects der Anspruch, immer einen validen Zustand zu repräsentieren. Entsprechend muss dies zum Erstellungszeitpunkt, also im Konstruktor, sichergestellt werden. Auch viele der vom JDK mitgelieferten Datentypen sind unveränderlich, so z. B. die Klassen java.lang.String, java.math.BigInteger und java.math.BigDecimal. Instanzen dieser Klassen können nicht verändert werden. Stattdessen geben Methoden wie BigInteger#add das Ergebnis in Form einer neuen Instanz zurück.

Vorteile von Immutability

Dass Value Objects auch unabhängig von Domain-driven Design sinnvoll sind, beschreibt Martin Fowler in seinem Blog [2]. Das Konzept Immutability hat sich außerhalb der objektorientierten Programmierung schon länger etabliert. So sind die primitiven Datentypen, wie beispielsweise Zahlen oder Strings, in den meisten anderen Programmiersprachen auch unveränderlich, und gerade in nebenläufigen Systemen senkt shared mutable State (also Zustand, den verschiedene Teile des Systems parallel ändern können) nicht gerade die Komplexität. Das wird jedem spätestens dann klar, wenn er mit relationalen Datenbanken arbeitet. Dort gibt es das Konzept der Datenbanktransaktionen, um durch Isolation der Herausforderung zu begegnen, dass der shared State parallel verändert werden könnte. Das geschieht, indem die Änderungen (zumindest logisch) nacheinander ausgeführt werden.

Ein weiterer Vorteil der Verwendung von unveränderlichen Werten ist, dass sich durch sie in der Regel baumartige Strukturen ergeben und keine zyklischen Objektgraphen. Das liegt daran, dass sich Rückwärtsreferenzen durch die Unverände...

Exklusives Abo-Special

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