Classe dati Kotlin

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 dataper 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()e hashCode()coppia, e toString()forma del costruttore principale
  • componentN() 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) o var(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 truese 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

Articoli interessanti...