Records vs. Klassen vs. Lombok
Vergleichen Sie Records mit herkömmlichen Klassen und Lombok-Annotationen, um das passende Werkzeug auszuwählen.
Records vs. Klassen vs. Lombok ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Records vs. Klassen vs. Lombok
Java bietet mehrere Ansätze zum Erstellen von Datentypen, die Daten transportieren: einfache Klassen mit Boilerplate-Code, Records (ab Java 16) oder Lombok-Annotationen. Die richtige Wahl hängt vom jeweiligen Anwendungsfall ab.
Das Boilerplate-Problem
Eine einfache Java-Klasse als Datencontainer erfordert viel Boilerplate-Code: Konstruktor, Getter, equals, hashCode und toString – und das für nur wenige Felder.
// Traditional class — lots of boilerplate
class ProductOld {
private final String id;
private final String name;
private final double price;
public ProductOld(String id, String name, double price) {
this.id = id; this.name = name; this.price = price;
}
public String getId() { return id; }
public String getName() { return name; }
public double getPrice() { return price; }
@Override public boolean equals(Object o) { /* ... */ }
@Override public int hashCode() { /* ... */ }
@Override public String toString() { /* ... */ }
}Die Record-Lösung
Ein Record fasst dieselbe Klasse in einer Zeile zusammen. Der Compiler generiert den gesamten Boilerplate-Code automatisch.
// Record — one line, same functionality
record Product(String id, String name, double price) {}
// Usage is almost identical except accessors use component names (no get prefix)
Product p = new Product("P001", "Laptop", 999.99);
System.out.println(p.id()); // P001 (not getId())
System.out.println(p.name()); // Laptop
System.out.println(p.price()); // 999.99
System.out.println(p); // Product[id=P001, name=Laptop, price=999.99]Lombok @Data und @Value
Lombok generiert Boilerplate-Code zur Compile-Zeit mithilfe von Annotationen. @Value erstellt eine unveränderliche Klasse ähnlich wie Records; @Data erstellt eine veränderliche Klasse.
// Lombok @Value — immutable (closest to record)
import lombok.Value;
@Value
public class LombokProduct {
String id;
String name;
double price;
// Lombok generates: all-args constructor, getters, equals, hashCode, toString
// Note: accessors follow getX() naming convention (getPrice(), not price())
}
// Lombok @Data — mutable
import lombok.Data;
@Data
public class MutableProduct {
private String id;
private String name;
private double price;
// Generates: getters, setters, equals, hashCode, toString, no-args constructor
}Wichtige Unterschiede
Wichtige Unterschiede zwischen Records, Lombok @Value und einfachen Klassen:
- Benennung der Zugriffsmethoden: Records verwenden
name(); Lombok verwendetgetName() - Veränderliche Variante: Records sind immer unveränderlich; Lombok bietet mit @Data veränderliche Klassen
- Vererbung: Records können keine Klassen erweitern; Lombok-Klassen können dies
- Abhängigkeit vom Build-Tool: Lombok erfordert die Einrichtung eines Annotation Processors; Records sind integriert
Wann Sie Records verwenden sollten
Records sind ideal, wenn:
- der Typ hauptsächlich als transparenter Datenträger dient (DTO, Value Object)
- Unveränderlichkeit von vornherein gewünscht ist
- Sie Java 16 oder höher verwenden und keine Abhängigkeiten wünschen
- der Typ an Pattern Matching beteiligt ist (sealed + records)
// Perfect record use cases:
record Coordinates(double lat, double lon) {}
record JwtClaims(String subject, String role, long expiresAt) {}
record PageRequest(int page, int size, String sortBy) {}
record ErrorResponse(int code, String message, String path) {}
// These are all simple data carriers with no mutable stateWann Sie Lombok verwenden sollten
Lombok ist die bessere Wahl, wenn:
- Sie veränderliche Beans benötigen (z. B. JPA-Entitäten oder Spring-Konfigurationsklassen)
- die Benennung der Zugriffsmethoden der JavaBeans-Konvention (
getX) entsprechen muss, damit Frameworks kompatibel bleiben - Sie
@Builderfür die komplexe Erstellung von Objekten benötigen - teilweise Veränderlichkeit erforderlich ist (
@NonFinalfür einige Felder)
// Lombok @Builder — great for complex object construction
import lombok.*;
@Builder
@Value
public class EmailMessage {
String to;
String from;
String subject;
String body;
List<String> attachments;
}
EmailMessage msg = EmailMessage.builder()
.to("user@example.com")
.from("noreply@app.com")
.subject("Welcome!")
.body("Thank you for signing up")
.attachments(List.of())
.build();Wann Sie einfache Klassen verwenden sollten
Einfache Klassen sind weiterhin sinnvoll, wenn:
- die Klasse komplexes Verhalten über die reine Datenhaltung hinaus besitzt
- Sie eine andere Klasse erweitern müssen
- eine detaillierte Kontrolle über hashCode/equals erforderlich ist
- veränderlicher Zustand mit Kapselung benötigt wird
// Plain class — when behavior dominates over data
class ShoppingCart {
private final List<CartItem> items = new ArrayList<>();
private final String customerId;
public ShoppingCart(String customerId) {
this.customerId = customerId;
}
public void addItem(CartItem item) { items.add(item); }
public void removeItem(String sku) { items.removeIf(i -> i.sku().equals(sku)); }
public double total() { return items.stream().mapToDouble(CartItem::lineTotal).sum(); }
public boolean isEmpty() { return items.isEmpty(); }
}Records und Klassen kombinieren
Records und Klassen lassen sich nahtlos miteinander kombinieren. Verwenden Sie Records für unveränderliche Daten innerhalb von Klassen, die veränderlichen Zustand verwalten.
// Record for the immutable event data
record UserEvent(String userId, String action, java.time.Instant timestamp) {
public static UserEvent now(String userId, String action) {
return new UserEvent(userId, action, java.time.Instant.now());
}
}
// Class for the mutable event store
class EventLog {
private final List<UserEvent> events = new ArrayList<>();
public void record(String userId, String action) {
events.add(UserEvent.now(userId, action));
}
public List<UserEvent> eventsFor(String userId) {
return events.stream()
.filter(e -> e.userId().equals(userId)).toList();
}
}Records in Spring Boot
Records lassen sich in Spring Boot gut als Request- und Response-Bodies verwenden. Der Jackson-Mapper von Spring verarbeitet sie mit minimaler Konfiguration.
// Spring Boot REST controller using records
import org.springframework.web.bind.annotation.*;
record CreateProductRequest(String name, double price, String category) {}
record ProductResponse(long id, String name, double price, String category) {}
@RestController
@RequestMapping("/api/products")
class ProductController {
@PostMapping
public ProductResponse create(@RequestBody CreateProductRequest req) {
// Jackson automatically deserializes JSON into the record
long id = productService.save(req);
return new ProductResponse(id, req.name(), req.price(), req.category());
}
}Leistungsvergleich
Alle drei Ansätze erzeugen für einfache Datenträger im Wesentlichen denselben Bytecode. Die Leistung ist identisch – bei der Wahl geht es um die Entwicklererfahrung und die Anforderungen.
// All three compile to approximately equivalent bytecode:
// - Records: compiler-generated, always immutable
// - Lombok @Value: annotation-processor-generated, always immutable
// - Plain class: hand-written
// The key runtime difference:
// Records: accessor is a method matching field name (price() not getPrice())
// Lombok/Class: accessor follows JavaBeans (getPrice())
// Jackson compatibility:
// Records: work natively in Jackson 2.12+ with no config
// Lombok: work with @JsonProperty or jackson-databind-lombok moduleKurze Wissensprüfung
Welcher Benennungskonvention folgen die Zugriffsmethoden von Records?
Zusammenfassung: Records vs. Klassen vs. Lombok
Die wichtigsten Erkenntnisse:
- Records generieren automatisch Konstruktor, Zugriffsmethoden (ohne das Präfix get), equals, hashCode und toString
- Records sind immer unveränderlich; verwenden Sie einfache Klassen für veränderlichen Zustand
- Lombok @Value kommt Records nahe, verwendet aber die Benennung getX() und erfordert eine Einrichtung
- Lombok @Builder eignet sich hervorragend für die komplexe Erstellung von Objekten mit vielen optionalen Feldern
- Records sind ideal für DTOs, Value Objects sowie API-Request- und -Response-Bodies
- Einfache Klassen bleiben die beste Wahl, wenn das Verhalten im Vordergrund steht oder Vererbung erforderlich ist
Lerne Java mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 104
- Lektionen
- 374
Häufig gestellte Fragen
Ist die Lektion „Records vs. Klassen vs. Lombok“ kostenlos?
Ja — der vollständige Text von „Records vs. Klassen vs. Lombok“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Records vs. Klassen vs. Lombok“?
Vergleichen Sie Records mit herkömmlichen Klassen und Lombok-Annotationen, um das passende Werkzeug auszuwählen. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Java Academy zu starten?
Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Records vs. Klassen vs. Lombok“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?
Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Records kennenlernen
- Kompakte Konstruktoren und Validierung
- Eigene Methoden in Records
- Records vs. Klassen vs. Lombok