Falk Sippach
25.09.2025
Mit Project Valhalla bekommt Java ein neues Datentyp-Konstrukt: Value Objects. Sie kombinieren die Performance primitiver Typen mit der Ausdruckskraft von Objekten und ermöglichen flaches Speicherlayout, weniger Garbage Collection und stärkere Typsicherheit. In diesem Artikel schauen wir uns an, was dahintersteckt, welche JEPs den Weg ebnen und wie Value Objects die Entwicklung in Java verändern werden.
Download der Folien vom JUG Saxony Day am 26.09.2026
Einer der großen Pluspunkte von Java war und ist das statische, starke Typsystem. Es hilft, viele Fehler bereits zur Compilezeit zu entdecken und macht die Entwicklung robuster sowie effizienter. Allerdings integrieren sich die vor etwa 30 Jahren aus Performancegründen eingeführten primitiven Datentypen nicht gut mit modernen Ansätze wie Generics, Stream API oder Pattern Matching. Value Objects versprechen Abhilfe und werden die Vorteile beider Welten kombinieren. Damit können wir in Zukunft unveränderbare Datentypen entwerfen, die sich wie primitive Datentypen verhalten. Das steigert nicht nur die Performance und senkt den Speicherverbrauch, es erhöht durch das Schreiben von ausdrucksstarken Typen auch die Les- und Wartbarkeit.
Schon seit etwa 10 Jahren wird im Rahmen vom Projekt Valhalla an dieser großen Änderung des Java Typsystems gearbeitet. Daran hängen einige komplexe Fragestellungen, wie z. B. der Umgang mit Default-Werten sowie null-Values, der Umbau der Wrapper-Typen (Integer, …) und die Verwendung als generische Typisierung. Im Sommer 2024 hat Java Language Architekt Brian Goetz verkündet, dass nach der langen Zeit der Durchbruch in der Umsetzung erreicht ist. Darum wollen wir hier schauen, wie Value Classes, Null-Restricted und Nullable Types sowie erweitertes Primitive Boxing die Art und Weise verändern, wie wir in Zukunft programmieren werden.
Das Motto von Projekt Valhalla trifft den Kern sehr gut:
“Codes like a class, works like an int.” (State of Valhalla: Part 1: The Road to Valhalla (2021))
Das Ziel: Die Ausdrucksstärke objektorientierter Referenztypen mit der Performance primitiver Typen zu vereinen.
Da nun schon seit einer Dekade an der Idee der Value Classes in Java gearbeitet wird, sind bereits einige vorbereitende Arbeiten in den letzten Java-Releases ausgeliefert worden:
CONSTANT_Dynamic
, Berechnung erst beim ersten Zugriff - erlaubt Lazy Initialization.Integer
, LocalDate
oder Optional
falsch genutzt werden. Diese Klassen sollen in der Zukunft in echte Value Classes migriert werden und die falsche Benutzung in Legacy Code würde dann zu Problemen führen.Das Java-Memory-Model unterscheidet strikt zwischen primitiven Datentypen, die im Stack abgelegt sind und Objekten, deren Referenz ebenfalls auf dem Stack, das eigentliche Objekt dann aber im Heap abgelegt ist. Diese Referenztypen benötigen für Meta-Informationen mehr Speicherplatz und sind im Heap auch deutlich weiter weg von ihrer Verarbeitung in der CPU abgelegt. Dadurch dauern Zugriffe länger und die Performance leidet. Dafür sind Referenztypen selbst definierbar, so dass wir benutzerdefinierte, gut les- und wartbare Typen für unsere fachlichen Anforderungen erstellen können.
int i = 12345; // liegt direkt auf dem Stack
Point p = new Point(1,1); // Referenz auf ein Objekt im Heap
Abbildung 1: zwei Variablen: primitiver (i) und Referenzdatentyp (p)
Eine Value Class lässt sich einfach mit dem neuen Schlüsselwort value
analog zu normalen Klassen bzw. Records anlegen.
value class PointValue { .. }
value record PointRecordValue(int x, int y);
PointRecordValue[] points = new PointRecordValue[10];
for (int i = 0; i < 10; i++) {
points[i] = new PointRecordValue(i, i);
}
Es gelten aber einige Einschränkungen:
Value Classes können aber auch ganz normale Instanzmethoden enthalten, die Verhalten des Objekts kapseln:
public value record Point(int x, int y) {
public Point moveBy(int dx, int dy) {
return new Point(x + dx, y + dy); }
}
Dieser Blog-Post ist noch nicht final. In Kürze werden weitere Informationen folgen.