In questo articolo imparerai a creare classi di dati in Kotlin. Imparerai anche i requisiti che la classe di dati deve soddisfare e le loro funzionalità standard.
Potrebbe verificarsi una situazione in cui è necessario creare una classe esclusivamente per contenere i dati. In questi casi, è possibile contrassegnare la classe come data
per creare una classe di dati. Per esempio,
classe di dati Person (val name: String, var age: Int)
Per questa classe, il compilatore genera automaticamente:
copy()
funzione,equals()
ehashCode()
coppia, etoString()
forma del costruttore principalecomponentN()
funzioni
Prima di parlare in dettaglio di queste funzionalità, parliamo dei requisiti che una classe di dati deve soddisfare.
Requisiti della classe di dati Kotlin
Ecco i requisiti:
- Il costruttore principale deve avere almeno un parametro.
- I parametri del costruttore principale devono essere contrassegnati come
val
(sola lettura) ovar
(lettura-scrittura). - La classe non può essere aperta, astratta, interiore o sigillata.
- La classe può estendere altre classi o implementare interfacce. Se stai usando la versione Kotlin precedente alla 1.1, la classe può implementare solo interfacce.
Esempio: Kotlin Data Class
data class User(val name: String, val age: Int) fun main(args: Array) ( val jack = User("jack", 29) println("name = $(jack.name)") println("age = $(jack.age)") )
Quando esegui il programma, l'output sarà:
nome = jack età = 29
Quando si dichiara una classe di dati, il compilatore genera automaticamente diverse funzioni, quali toString()
, equals()
, hashcode()
ecc dietro le quinte. Questo aiuta a mantenere il codice conciso. Se avessi usato Java, avresti bisogno di scrivere molto codice boilerplate.
Usiamo queste funzioni:
Copia
Per una classe di dati, puoi creare una copia di un oggetto con alcune delle sue proprietà differenti usando copy()
function. Ecco come funziona:
data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) // using copy function to create an object val u2 = u1.copy(name = "Randy") println("u1: name = $(u1.name), name = $(u1.age)") println("u2: name = $(u2.name), name = $(u2.age)") )
Quando esegui il programma, l'output sarà:
u1: nome = John, nome = 29 u2: nome = Randy, nome = 29
metodo toString ()
La funzione toString () restituisce una rappresentazione di stringa dell'oggetto.
data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) println(u1.toString()) )
Quando esegui il programma, l'output sarà:
Utente (nome = Giovanni, età = 29)
hashCode () ed equals ()
Il hasCode()
metodo restituisce il codice hash per l'oggetto. Se due oggetti sono uguali, hashCode()
produce lo stesso risultato intero. Lettura consigliata: hashCode ()
I equals()
rendimenti true
se due oggetti sono uguali (ha lo stesso hashCode()
). Se gli oggetti non sono uguali, equals()
restituisce false
. Lettura consigliata: uguale a ()
data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) val u2 = u1.copy() val u3 = u1.copy(name = "Amanda") println("u1 hashcode = $(u1.hashCode())") println("u2 hashcode = $(u2.hashCode())") println("u3 hashcode = $(u3.hashCode())") if (u1.equals(u2) == true) println("u1 is equal to u2.") else println("u1 is not equal to u2.") if (u1.equals(u3) == true) println("u1 is equal to u3.") else println("u1 is not equal to u3.") )
Quando esegui il programma, l'output sarà:
u1 hashcode = 71750738 u2 hashcode = 71750738 u3 hashcode = 771732263 u1 è uguale a u2. u1 non è uguale a u3.
Dichiarazioni di destrutturazione
È possibile destrutturare un oggetto in un numero di variabili utilizzando la dichiarazione di distruzione. Per esempio:
classe di dati Utente (val name: String, val age: Int, val gender: String) fun main(args: Array) ( val u1 = User("John", 29, "Male") val (name, age, gender) = u1 println("name = $name") println("age = $age") println("gender = $gender") )
Quando esegui il programma, l'output sarà:
nome = Giovanni età = 29 sesso = maschio
Ciò è stato possibile perché il compilatore genera componentN()
funzioni tutte le proprietà per una classe di dati. Per esempio:
data class User(val name: String, val age: Int, val gender: String) fun main(args: Array) ( val u1 = User("John", 29, "Male") println(u1.component1()) // John println(u1.component2()) // 29 println(u1.component3()) // "Male" )
Quando esegui il programma, l'output sarà:
John 29 Maschio