Menu
Coddy logo textTech

Record (Java 16+)

Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 51 di 87.

Quando crei semplici classi che trasportano dati, spesso scrivi codice boilerplate ripetitivo: campi privati, un costruttore, getter, toString(), equals() e hashCode(). Java 16 ha introdotto i record per eliminare questa noia.

Un record è una classe speciale progettata per contenere dati immutabili. Lo dichiari con la parola chiave record seguita dall’elenco dei componenti:

record Person(String name, int age) { }

// Quella singola riga fornisce automaticamente:
// - campi private final: name e age
// - un costruttore: Person(String name, int age)
// - metodi di accesso: name() e age()
// - toString(), equals() e hashCode()

Usare un record è semplice:

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]

Nota che i metodi di accesso non usano il prefisso get: prendono semplicemente il nome dai campi. I record sono implicitamente final, quindi non possono essere estesi. Anche tutti i campi sono final, il che rende i record intrinsecamente immutabili.

Puoi aggiungere metodi personalizzati e sovrascrivere quelli generati automaticamente, se necessario. Puoi anche aggiungere una convalida in un costruttore compatto:

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

I record sono perfetti per i DTO, le risposte API o qualsiasi scenario in cui ti serva un semplice contenitore di dati immutabile senza dover scrivere codice boilerplate.

challenge icon

Sfida

Facile

Costruiamo un sistema di prenotazione di biglietti per il cinema che mette in mostra l'eleganza dei record Java. Vedrai come i record eliminano il codice ripetitivo, consentendoti comunque di aggiungere metodi personalizzati e convalide.

Organizzerai il codice in tre file:

  • Movie.java: crea un record che rappresenta un film con tre componenti: title (String), genre (String) e durationMinutes (int). Aggiungi un metodo personalizzato chiamato getFormattedDuration() che restituisce la durata in un formato intuitivo: [hours]h [minutes]m (per esempio, 142 minuti diventano 2h 22m). Usa la divisione intera e il modulo per calcolare le ore e i minuti rimanenti.
  • Ticket.java: crea un record che rappresenta un biglietto per il cinema con tre componenti: movie (Movie), seatNumber (String) e price (double). Aggiungi un costruttore compatto che convalida il prezzo: se il prezzo è minore o uguale a zero, lancia un IllegalArgumentException con il messaggio Price must be positive. Aggiungi anche un metodo personalizzato chiamato printTicket() che restituisce una stringa su più righe:
    ========== TICKET ==========
    Movie: [movie title]
    Genre: [movie genre]
    Duration: [formatted duration from movie]
    Seat: [seatNumber]
    Price: $[price]
    ============================
  • Main.java: assembla il tuo sistema di prenotazione! Riceverai cinque input: titolo del film (String), genere (String), durata in minuti (int), numero del posto (String) e prezzo del biglietto (double).

    Crea un record Movie con i primi tre input, poi crea un record Ticket con il film, il numero del posto e il prezzo. Stampa il risultato della chiamata a printTicket() sul tuo biglietto.

Riceverai cinque input in questo ordine: titolo del film, genere, durata (minuti), numero del posto e prezzo.

Nota quanto sono più puliti i record rispetto alle classi tradizionali: non c'è bisogno di scrivere costruttori, getter, toString(), equals() o hashCode(). Il costruttore compatto ti permette di aggiungere convalide senza ripetere le assegnazioni dei campi, e puoi comunque aggiungere metodi personalizzati quando servono!

Provalo tu

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Leggi i dati in ingresso
        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: Crea un record Movie con title, genre e durationMinutes
        
        // TODO: Crea un record Ticket con movie, seatNumber e price
        
        // TODO: Stampa il biglietto usando il metodo printTicket()
        
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Java online