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.
Sfida
FacileCostruiamo 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) edurationMinutes(int). Aggiungi un metodo personalizzato chiamatogetFormattedDuration()che restituisce la durata in un formato intuitivo:[hours]h [minutes]m(per esempio, 142 minuti diventano2h 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) eprice(double). Aggiungi un costruttore compatto che convalida il prezzo: se il prezzo è minore o uguale a zero, lancia unIllegalArgumentExceptioncon il messaggioPrice must be positive. Aggiungi anche un metodo personalizzato chiamatoprintTicket()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()
}
}
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
1Fondamenti della programmazione a oggetti
File esterniIntroduzione alla programmazione a oggettiClassi e oggettiLa parola chiave thisMetodiCampi (attributi)Metodo costruttoreSovraccarico dei costruttoriRipasso - Calcolatrice semplice4Ereditarietà
Ereditarietà di base (extends)La parola chiave superSovrascrittura dei metodi (@Override)Concatenamento dei costruttoriLa classe ObjectEreditarietà singola e multilivelloPerché non esiste l'ereditarietà multipla delle classiRiepilogo: gerarchia dei dipendenti7Metodi speciali e classe Object
Metodo toString()equals() e hashCode()Metodo clone()compareTo() e ComparableInterfaccia ComparatorRiepilogo - Ordinamento personalizzato2Modificatori di accesso e incapsulamento
Panoramica dei livelli di accessoMetodi getter e setterNascondimento delle informazioniLa parola chiave finalRiepilogo - Gestore di conti bancari5Polimorfismo
Nozioni di base sull'overloading dei metodiOverride dei metodi (a runtime)Upcasting e downcastingL'operatore instanceofClassi e metodi astrattiRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàAggregazione vs composizioneClassi interne, annidate e anonimeEnum e metodi degli EnumRecord (Java 16+)Classi sealed (Java 17+)11Modelli di progettazione Parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern BuilderPattern ObserverPattern Strategy3Proprietà di classe e membri statici
Variabili di istanza e staticheMetodi staticiBlocchi staticiCostanti (static final)Riepilogo - Contatore e utility6Interfacce e classi astratte
Introduzione alle interfacceImplementazione delle interfacceImplementazione di più interfacceMetodi default e static nelle interfacceClassi astratte e interfacce a confrontoInterfacce funzionaliRiepilogo: sistema di pagamento9Tipi generici
Introduzione ai tipi genericiClassi genericheMetodi genericiParametri di tipo con limitiCaratteri jolly (?, extends, super)Riepilogo - Contenitore generico12Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern IteratorEsercitati da solo: Compilatore Java online