Wann verwendet man wirklich Record Classes (Java)?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

In Anwendungen kommt es öfter vor, dass man reine Modelklassen benötigt, die lediglich dazu dienen, auf eine externe Speicherquelle gemappt zu werden (z.B. auf die Felder einer Datenbanktabelle oder die Properties eines JSON-Objekts, welches man von einer API zurückbekommt). Im besten Fall sind die Felder zudem unveränderlich (konstant), das heißt sie werden nur über den Konstruktor definiert.

An dieser Stelle kommen record-Klassen ins Spiel, denn sie verkürzen eine Implementation solcher Datenklassen. Viel von dem üblichen Boilerplate-Code kann eingespart werden. Dazu gehören die Felddeklarationen, die Konstruktorimplemenation (Zuweisung der Parameter zu den jeweiligen Feldern), Getter-Methoden sowie eine passende equals- und eine hashCode-Methode.

Du verwendest Records vor allem dann, wenn du Daten einfach als Daten modellieren willst. Records nennt man auch "nominal tuples": also (benannte) Tupel mit (benannten) Feldern.

Wobei Records in Java natürlich auch beliebige Methoden enthalten können. Sie machen es aber sehr viel bequemer, einfache Datenhalter-Klassen zu bauen. Lästige und fehleranfällige Arbeiten wie das Schreiben von Gettern, korrekten toString() oder equals()-Methoden fallen einfach weg.

Eine etwas fortgeschrittenere Anwendung sind algebraische Datentypen. Klingt komplizierter, als es ist: https://www.infoq.com/articles/data-oriented-programming-java/

Ist das eher nur für ganz spezielle Programme?

Ich würde es andersrum sehen: man sollte immer Records bevorzugen und "normale" Klassen nur dann verwenden, wenn es mit einem Record nicht klappt. Etwa dann, wenn die Daten prinzipiell veränderlich sind oder du wirklich Vererbung brauchst.