Home > Informatik > Begriffe und Konzepte > Records

Records

Definition

Referenz

Seit Java 16 gibt es den neuen Typ record.

Ein record ist eine spezielle Klasse, die automatisch alle Instanzvariablen als final (und damit unveränderbar) anlegt, einen kanonischen Konstruktor erzeugt, automatisch für jede Instanzvariable eine Getter-Methode anlegt (ohne get-Präfix) und die Methoden toString(), equals(Object o) und hashCode() implementiert.

Erläuterungen

Ein kanonischer Konstruktor ist ein Konstruktor, der alle Zustände (Werte der Instanzvariablen) initialisiert.

Jeder Record ist eine Unterklasse von java.lang.Record und erbt die Methoden toString(), equals(Object o) und hashCode(). Von einer Record-Klasse können keine Unterklassen erzeugt werden.

Beispiel 1
public record User(String username, String email) {}

Dieser Record erzeugt automatisch:

  • zwei finale Instanzvariablen username und email
  • einen Konstruktor mit zwei String-Parametern
  • zwei Getter-Methoden username() und email()
  • sowie Implementationen von toString(), equals() und hashCode()

Ein Record der Klasse User kann dann wie folgt benutzt werden (Beispiel):

User u = new User("Max Mustermann","mmustermann@web.de");
System.out.println(u.username());
Beispiel 2
public record Punkt(int x, int y) {}

Ein Record der Klasse Punkt kann dann wie folgt benutzt werden (Beispiel):

Punkt mittelpunkt = new Punkt(50,100);
System.out.println(mittelpunkt.x());

Da die Instanzvariable x als private deklariert wurde, kann nicht direkt mit mittelpunkt.x auf sie zugegriffen werden, sondern nur über die Getter-Methode mittelpunkt.x().

Ein ausführliches Beispiel

In dem 2025 neu erschienenem Buch von Balzert [3] ist sehr schön dargestellt, wie viel Arbeit und Quelltext ein Record einsparen kann. Und zwar wird hier ein Record vorgestellt, der eine Klasse Point repräsentiert, die zwei Instanzvariablen x und y besitzt und keine Methoden.

Die Deklaration dieses Records ist ganz einfach und kann in einer Zeile erfolgen:

public record Point(int x, int y) {}

Würde man nun eine äquivalente Java-Klasse implementieren, also eine Klasse, die das Gleiche leistet wie dieser Record, dann sähe das so aus:

public class Point 
{
   private final int x;
   private final int y;
   
   public Point(int x, int y)
   {
      this.x = x;
      this.y = y;
   }
	
   public int getX() 
   {
      return x;
   }

   public int getY() 
   {
      return y;
   }

   @Override
   public boolean equals(Object obj) 
   {
      if (this == obj) return true;
      if (obj == null || getClass() != obj.getClass()) 
         return false;

      Point point = (Point) obj;
      return x == point.x && y == point.y;
   }
	
   @Override
   public int hashCode() 
   {
      return Objects.hash(x, y);
   }

   @Override
   public String toString() 
   {
      return "Point[x=" + x + ", y=" + y + "]";
   }
}

Für eine einfache Anwendung von Point müsste man die drei letzten Methoden natürlich nicht überschreiben, trotzdem wäre der Quelltext immer noch sehr viel länger als die einzeilige Record-Definition.

Quellen:

  1. Martin. Clean Code - A Handbook of Agile Software Craftmanship. Pearson Education 2009.
  2. Ullenboom: Java ist auch eine Insel, Rheinwerk Computing 2023.
  3. Balzert: Objektorientiert Programmieren, 4. Auflage, Springer-Verlag Berlin 2025.