Klar und deutlich, bitte!

Records & Sealed Types: Neue Typen für Java

Dominik Mohilo

© Shutterstock / vchal

Die Programmiersprache Java steht oft ob ihrer angeblichen Schwerfälligkeit in der Kritik. Ein wenig Abhilfe diesbezüglich sollen der neue Java-Typ Record und sogenannte Sealed Types schaffen. Ein entsprechender Vorschlag zur Erweiterung der Sprache wurde gerade von höchster Stelle vorgelegt…

Im Projekt Valhalla werden seit einiger Zeit die Value Types für Java entwickelt. Federführend beim Projekt ist Brian Goetz, seines Zeichens Java Language Architect bei Oracle. In seinem neuesten JEP-Entwurf geht es ebenfalls um neue Typen: Records und Sealed Types. Diese auch als „algebraische Datentypen“ bekannten Erweiterungen sollen mit kompakterer Syntax die Deklaration gewisser Klassen vereinfachen bzw. deren Unterklassen einschränkbar machen.

Achtung! Wie immer weisen wir explizit darauf hin, dass es sich hierbei um einen Entwurf für ein Java Enhancement Proposal (JEP) handelt. Die beschriebene Funktionalität ist weder als finales JEP anzusehen, noch ist dieses JEP irgendeiner Java-Version zugeordnet. Eine Voraussage, wann diese neuen Typen die Java-Plattform erreichen und in Produktion eingesetzt werden können, wäre rein spekulativ.

Wie Brian Goetz in seinem Draft schreibt, gibt es gewisse Klassen, die nichts anderes sind als reine „Datenträger“. Um solche Klassen anständig zu schreiben, so Goetz, sei es nötig, eine große Menge wenig wertvollen, repetitiven und fehleranfälligen Code zu schreiben. Oft kann hier eine Entwicklungsumgebung helfen, aber oft fällt es hinterher trotzdem schwer, die Hintergründe des Designs einer Klasse wirklich zu überblicken (Stichwort: Boilerplate).

Wer nun glaubt, es ginge Brian Goetz und seinem Team lediglich um die Reduktion von Boilerplate, der tut ihnen großes Unrecht: Es gehe vielmehr darum, eine semantisch elegante und konsistente Lösung zum Schreiben von Datenaggregaten in Java einzuführen. Und auch das Organisieren solcher Aggregate in relativen Hierarchien sollte nach Möglichkeit entsprechend simpel und klar durchführbar sein. Genau hier kommen die neuen Typen ins Spiel.

W-JAX 2019 Java-Dossier für Software-Architekten

Kostenlos: 30+ Seiten Java-Wissen von Experten

Sie finden Artikel zu EnterpriseTales, Microservices, Req4Arcs, Java Core und Angular-Abenteuer von Experten wie Uwe Friedrichsen (codecentric AG), Arne Limburg (Open Knowledge), Manfred Steyer (SOFTWAREarchitekt.at) und vielen weiteren.

 

Records

Der erste neue Typ, um den es sich bei dem Entwurf handelt, sind Records. Diese stellen – wie beispielsweise auch enums – eine eingeschränkte Form der Deklaration class dar. Records unterscheiden sich von klassischen Klassen darin, dass sie ihr API nicht von dessen Repräsentation entkoppeln können. Die Freiheit die dabei verloren geht, wird aber durch die gewonnene Präzision wettgemacht.

Im Proposal heißt es dazu, dass ein Record „der Zustand, der gesamte Zustand und nichts als der Zustand“ sei. Er besteht aus einem Namen, der Statusbeschreibung und dem Body:

record Point(int x, int y) { }

Records bleiben dabei Klassen, auch wenn sie eingeschränkt sind. So können sie etwa Annotationen oder Javadocs enthalten und deren Body u.a. statische Felder sowie Methoden, Konstruktoren oder Instanzmethoden deklarieren. Was sie allerdings nicht vermögen, ist die Erweiterung anderer Klassen oder die Deklaration von Instanzfeldern (mit der Ausnahme der Statuskomponenten, die im Header des Records deklariert wurden).

Sealed Types

„Versiegelte Typen”, also Sealed Types, haben eine stark eingeschränkte Subclassing-Fähigkeit, die in der entsprechenden Typ-Deklaration definiert wird. Hierdurch kann begrenzt werden, welche Klassen Subclasses sein dürfen. Dies funktioniert übrigens auch mit abstrakten Klassen oder Interfaces. Eine Klasse wird wie folgt versiegelt:

sealed interface Node
     permits A, B, C { ... }

Die oben gezeigte Liste an erlaubten Subclasses ist optional, im konkreten Fall könnte der Node nur von den in der Liste aufgeführten Typen erweitert werden. Hinzu kommt, dass diese Elemente auch Teil des gleichen Packages oder Moduls sein müssen.

Einen tieferen Einblick in die technischen Details und mögliche Alternativen zu den hier kurz vorgestellten neuen Typen gibt es im JEP Draft von Brian Goetz. Noch detaillierter führt er dies in seinem Artikel Data Classes and Sealed Types for Java aus.

Verwandte Themen:

Geschrieben von
Dominik Mohilo
Dominik Mohilo
Dominik Mohilo studierte Germanistik und Soziologie an der Goethe-Universität in Frankfurt. Seit 2015 ist er Redakteur bei S&S-Media.
Kommentare

Hinterlasse einen Kommentar

4 Kommentare auf "Records & Sealed Types: Neue Typen für Java"

avatar
4000
  Subscribe  
Benachrichtige mich zu:
Jens
Gast

„der Status, der gesamte Status und nichts als der Status“, im Original „the state, the whole state, and nothing but the state“ wird wohl besser übersetzt mit „der Zustand, der gesamte/komplette Zustand und nichts als der Zustand“.

„Status“ klingt in diesem Zusammenhang etwas merkwürdig und sinnentstellend.

TestP
Gast

Endlich. Auf Records warte ich schon länger. 🙂

Grüße

TestP
Gast

Endlich. Auf Records warte ich schon länger.