Menu
Coddy logo textTech

Records (Java 16+)

Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy. Leçon 51 sur 87.

Lorsque vous créez des classes simples destinées à transporter des données, vous écrivez souvent du code répétitif : des champs privés, un constructeur, des accesseurs, toString(), equals() et hashCode(). Java 16 a introduit les records pour éliminer cette corvée.

Un record est une classe spéciale conçue pour contenir des données immuables. Vous le déclarez avec le mot-clé record suivi de la liste des composants :

record Person(String name, int age) { }

// Cette seule ligne fournit automatiquement :
// - des champs private final : name et age
// - un constructeur : Person(String name, int age)
// - des méthodes d'accès : name() et age()
// - toString(), equals() et hashCode()

Utiliser un record est simple :

Person p = new Person("Alice", 30);
System.out.println(p.name());    // Alice
System.out.println(p.age());     // 30
System.out.println(p);           // Person[name=Alice, age=30]

Note que les méthodes accessor n’utilisent pas le préfixe get : elles portent simplement le nom des champs. Les records sont implicitement final, ils ne peuvent donc pas être étendus. Tous les champs sont également final, ce qui rend les records intrinsèquement immuables.

Vous pouvez ajouter des méthodes personnalisées et remplacer celles générées automatiquement si nécessaire. Vous pouvez également ajouter une validation dans un constructeur compact :

record Person(String name, int age) {
    public Person {
        if (age < 0) throw new IllegalArgumentException("Age cannot be negative");
    }
}

Les records sont parfaits pour les DTO, les réponses d’API ou tout scénario où vous avez besoin d’un conteneur de données simple et immuable sans écrire de code passe-partout.

challenge icon

Défi

Facile

Construisons un système de réservation de billets de cinéma qui met en valeur l’élégance des records Java. Vous verrez comment les records éliminent le code répétitif tout en vous permettant d’ajouter des méthodes personnalisées et de la validation.

Vous organiserez votre code sur trois fichiers :

  • Movie.java : créez un record représentant un film avec trois composants : title (String), genre (String) et durationMinutes (int). Ajoutez une méthode personnalisée appelée getFormattedDuration() qui renvoie la durée dans un format convivial : [hours]h [minutes]m (par exemple, 142 minutes deviennent 2h 22m). Utilisez la division entière et le modulo pour calculer les heures et les minutes restantes.
  • Ticket.java : créez un record représentant un billet de cinéma avec trois composants : movie (Movie), seatNumber (String) et price (double). Ajoutez un constructeur compact qui valide le prix : si le prix est inférieur ou égal à zéro, lancez une IllegalArgumentException avec le message Price must be positive. Ajoutez également une méthode personnalisée appelée printTicket() qui renvoie une chaîne multiligne :
    ========== TICKET ==========
    Movie: [movie title]
    Genre: [movie genre]
    Duration: [formatted duration from movie]
    Seat: [seatNumber]
    Price: $[price]
    ============================
  • Main.java : assemblez votre système de réservation ! Vous recevrez cinq entrées : le titre du film (String), le genre (String), la durée en minutes (int), le numéro de siège (String) et le prix du billet (double).

    Créez un record Movie avec les trois premières entrées, puis créez un record Ticket avec le film, le numéro de siège et le prix. Affichez le résultat de l’appel à printTicket() sur votre billet.

Vous recevrez cinq entrées dans l’ordre suivant : le titre du film, le genre, la durée (en minutes), le numéro de siège et le prix.

Remarquez à quel point les records sont plus clairs que les classes traditionnelles : il n’est pas nécessaire d’écrire des constructeurs, des accesseurs, toString(), equals() ou hashCode(). Le constructeur compact vous permet d’ajouter une validation sans répéter les affectations de champs, et vous pouvez toujours ajouter des méthodes personnalisées lorsque cela est nécessaire !

Essayez vous-même

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Lire les entrées
        String title = scanner.nextLine();
        String genre = scanner.nextLine();
        int durationMinutes = Integer.parseInt(scanner.nextLine());
        String seatNumber = scanner.nextLine();
        double price = Double.parseDouble(scanner.nextLine());
        
        // TODO: Créer un record Movie avec title, genre et durationMinutes
        
        // TODO: Créer un record Ticket avec le movie, seatNumber et price
        
        // TODO: Afficher le ticket en utilisant la méthode printTicket()
        
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur Java en ligne