Records, classes et Lombok
Comparez les records aux classes traditionnelles et aux annotations Lombok pour choisir l’outil approprié.
Records, classes et Lombok est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.
Enregistrements, classes et Lombok
Java propose plusieurs approches pour créer des types porteurs de données : des classes ordinaires avec du code répétitif, des enregistrements (Java 16+) ou des annotations Lombok. Le choix de la bonne approche dépend du cas d’utilisation.
Le problème du code répétitif
Une classe Java ordinaire servant de simple porteuse de données nécessite beaucoup de code répétitif : constructeur, accesseurs, equals, hashCode et toString, le tout pour seulement quelques champs.
// 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() { /* ... */ }
}La solution des enregistrements
Un enregistrement réduit cette même classe à une seule ligne. Le compilateur génère automatiquement tout le code répétitif.
// 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 et @Value
Lombok génère du code répétitif à la compilation au moyen d’annotations. @Value crée une classe immuable semblable aux enregistrements, tandis que @Data crée une classe mutable.
// 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
}Différences clés
Différences importantes entre les enregistrements, Lombok @Value et les classes ordinaires :
- Nommage des accesseurs : les enregistrements utilisent
name(); Lombok utilisegetName() - Variante mutable : les enregistrements sont toujours immuables ; Lombok propose @Data pour la mutabilité
- Héritage : les enregistrements ne peuvent pas étendre de classes ; les classes Lombok le peuvent
- Dépendance à l’outil de compilation : Lombok nécessite la configuration d’un processeur d’annotations ; les enregistrements sont intégrés au langage
Quand utiliser les enregistrements
Les enregistrements sont idéaux lorsque :
- Le type sert principalement de conteneur de données transparent (DTO, objet valeur)
- L’immuabilité est souhaitée par conception
- Vous utilisez Java 16 ou une version ultérieure et souhaitez zéro dépendance
- Le type participe à la correspondance de motifs (sealed + enregistrements)
// 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 stateQuand utiliser Lombok
Lombok est préférable lorsque :
- Vous avez besoin de beans mutables (par exemple, des entités JPA ou des classes de configuration Spring)
- Le nommage des accesseurs doit suivre la convention JavaBeans (
getX) pour assurer la compatibilité avec les frameworks - Vous avez besoin de
@Builderpour construire des objets complexes - Une mutabilité partielle est nécessaire (
@NonFinalsur certains champs)
// 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();Quand utiliser des classes ordinaires
Les classes ordinaires restent appropriées lorsque :
- La classe possède un comportement complexe qui dépasse le simple transport de données
- Vous devez étendre une autre classe
- Un contrôle précis de hashCode/equals est nécessaire
- Un état mutable avec encapsulation est requis
// 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(); }
}Mélanger enregistrements et classes
Les enregistrements et les classes fonctionnent parfaitement ensemble. Utilisez des enregistrements pour les données immuables au sein de classes qui gèrent un état mutable.
// 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();
}
}Les enregistrements dans Spring Boot
Les enregistrements s’intègrent bien à Spring Boot comme corps de requêtes et de réponses. Le mappeur Jackson de Spring les prend en charge avec une configuration minimale.
// 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());
}
}Comparaison des performances
Les trois approches produisent essentiellement le même code binaire pour les simples conteneurs de données. Les performances sont identiques : le choix dépend de l’expérience de développement et des exigences.
// 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 moduleVérification rapide
Quelle convention de nommage les accesseurs des enregistrements suivent-ils ?
Récapitulatif : enregistrements, classes et Lombok
Points essentiels :
- Les enregistrements génèrent automatiquement le constructeur, les accesseurs (sans préfixe get), equals, hashCode et toString
- Les enregistrements sont toujours immuables ; utilisez des classes ordinaires pour un état mutable
- Lombok @Value se rapproche des enregistrements, mais utilise le nommage getX() et nécessite une configuration
- Lombok @Builder excelle dans la construction d’objets complexes comportant de nombreux champs facultatifs
- Les enregistrements sont idéaux pour les DTO, les objets valeur et les corps de requêtes/réponses d’API
- Les classes ordinaires restent préférables lorsque le comportement prédomine ou qu’un héritage est nécessaire
Questions Fréquemment Posées
La leçon « Records, classes et Lombok » est-elle gratuite ?
Oui — le texte complet de « Records, classes et Lombok » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Records, classes et Lombok » ?
Comparez les records aux classes traditionnelles et aux annotations Lombok pour choisir l’outil approprié. Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Java Academy ?
Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Records, classes et Lombok » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?
Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Découvrir les records
- Constructeurs compacts et validation
- Méthodes personnalisées dans les records
- Records, classes et Lombok