INTRODUZIONE AI RECORD

java-logoI 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.

Definizione

ESEMPIO DI RECORD

Vediamo un primo esempio di record.

Esempio di record

Le istanze di questo record avranno uno stato immutabile, cioè una volta create non saranno più modificabili.

Istanza di un record

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.

struttura di un record

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.

Metodi di accesso

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.

Costruttore canonico

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.

Override metodi di Object

CREIAMO UN RECORD

Vediamo come avviene la creazione di un record.

Creazione di un record

Vediamo l’output prodotto.

Output

Specificando solo il nome dell’istanza viene invocato il metodo toString() di Object ridefinito dal compilatore.

Output

Override del metodo equals ridefinito dal compilatore. Ritorna true in quanto i componenti sono uguali.

Output

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.

Output

Infine vediamo l’hashCode() per l’istanza p1.

Output

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.

Classe Random

valore conterrà un numero intero casuale compreso tra zero e cinquanta. Introduciamo un record in MyClass.

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.

Immutabilità superficiale

CANONICAL CONSTRUCTOR

Vedremo che è possibile ridefinire il costruttore canonico quando ne abbiamo bisogno.

Canonical constructor

Questo costruttore così ridefinito modifica il nome in maiuscolo (metodo toUpperCase()). Vediamo l’output.

Costruttore ridefinito

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.

Non canonical constructor

LINK AI POST PRECEDENTI

IL LINGUAGGIO JAVA

LINK AL CODICE SU GITHUB

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.