INTRODUZIONE AI RECORD
I record sono un tipo speciale di classe e sono stati introdotti a partire dalla versione 16 del linguaggio. La parte speciale dei record è il loro state, cioè lo stato delle loro variabili di istanza, che è immutable-readable. Una volta creata l’istanza di un record lo stato diventa immutabile, cioè i valori che compongono le variabili di istanza sono leggibili ma non riscrivibili. Possiamo considerare un record un type che aggrega due o più valori, e che consente di muovere insieme questo aggregato di valori in una forma più leggera e meno verbosa rispetto alle classi. Vediamo la sua definizione.
ESEMPIO DI RECORD
Vediamo un primo esempio di record.
Le istanze di questo record avranno uno stato immutabile, cioè una volta create non saranno più modificabili.
LA STRUTTURA DI UN RECORD
La definizione di un record produce una classe che ha un campo per ogni parametro, vengono generati in automatico dal compilatore come private e final. Questo significa che i componenti sono invisibili all’esterno e che una volta inizializzati non possono essere più modificati. Vediamo una figura.
La definizione di un record genera inoltre la definizione di alcuni metodi di accesso, che ci consentono di accedere in lettura ai componenti senza doverli scrivere noi direttamente.
Un altro elemento introdotto automaticamente dal compilatore nella definizione di un record è un costruttore, il suo compito è inizializzare i valori dei componenti nel momento della creazione dell’istanza di un record. Questo costruttore sostituisce il costruttore di default nelle classi che già abbiamo imparato ad utilizzare.
Il compilatore genera automaticamente anche l’override di tre metodi della classe Object, hashCode() fa sempre parte della classe Object, è un intero generato per ogni singolo oggetto. Due record avranno lo stesso hashCode() se hanno gli stessi valori in tutte le loro componenti.
CREIAMO UN RECORD
Vediamo come avviene la creazione di un record.
Vediamo l’output prodotto.
Specificando solo il nome dell’istanza viene invocato il metodo toString() di Object ridefinito dal compilatore.
Override del metodo equals ridefinito dal compilatore. Ritorna true in quanto i componenti sono uguali.
Il metodo hashCode() è lo stesso per l’istanza p2 e p3 in quanto come già detto l’intero che viene generato è uguale per due oggetti se i componenti hanno gli stessi valori.
Infine vediamo l’hashCode() per l’istanza p1.
SUPERFICIALMENTE IMMUTABILE
Abbiamo visto che la caratteristica fondamentale di un record è quella di essere immutabile. Una volta creato non ammette modifiche nel proprio stato (valore dei componenti). In realtà lo stato degli oggetti che costituiscono le componenti è mutabile. Useremo nell’esempio di codice la classe Random, un generatore di numeri pseudo casuali. Vediamo un esempio.
valore conterrà un numero intero casuale compreso tra zero e cinquanta. Introduciamo un record in MyClass.
Questo codice dimostra che il valore di casuale è cambiato solo in modo superficiale, in altre parole è l’oggetto associato al componente mr1 ad aver cambiato il proprio stato. Riassumendo, i componenti dei record sono immutabili, però è possibile modificare i valori degli oggetti che sono associati ai componenti, in quanto questa attività è consentita e viene chiamata immutabilità superficiale.
CANONICAL CONSTRUCTOR
Vedremo che è possibile ridefinire il costruttore canonico quando ne abbiamo bisogno.
Questo costruttore così ridefinito modifica il nome in maiuscolo (metodo toUpperCase()). Vediamo l’output.
NON-CANONICAL CONSTRUCTOR
Prendiamo in esame il caso in cui vogliamo definire costruttori non canonici nei record. Questo si può fare a patto che ad un certo punto della sua esecuzione ogni costruttore non canonico deve richiamare il costruttore canonico. Vediamo un esempio.
LINK AI POST PRECEDENTI
LINK AL CODICE SU GITHUB
ESECUZIONE DEL CODICE DI ESEMPIO
- Scaricare il codice da GITHUB, lanciare il file JAR con il seguente comando in Visual Studio Code, posizionandosi nella directory contenente il JAR.
java -jar –enable-preview CorsoJava.jar
- Oppure mettere in esecuzione il main che si trova nel file CorsoJava.java.
Scrivi un commento