I den här artikeln lär du dig att skapa dataklasser i Kotlin. Du lär dig också om krav som dataklassen måste uppfylla och deras standardfunktioner.
Det kan uppstå en situation där du behöver skapa en klass enbart för att hålla data. I sådana fall kan du markera klassen för data
att skapa en dataklass. Till exempel,
dataklass Person (val namn: Sträng, var ålder: Int)
För denna klass genererar kompilatorn automatiskt:
copy()
funktion,equals()
ochhashCode()
par, ochtoString()
form av den primära konstruktörencomponentN()
funktioner
Innan vi pratar om dessa funktioner i detalj, låt oss prata om krav som en dataklass måste uppfylla.
Kotlin Krav på dataklass
Här är kraven:
- Primärkonstruktören måste ha minst en parameter.
- Parametrarna för den primära konstruktören måste markeras som antingen
val
(skrivskyddad) ellervar
(skriv-skriv). - Klassen kan inte vara öppen, abstrakt, inre eller förseglad.
- Klassen kan utöka andra klasser eller implementera gränssnitt. Om du använder Kotlin-versionen före 1.1 kan klassen bara implementera gränssnitt.
Exempel: Kotlin-dataklass
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)") )
När du kör programmet blir resultatet:
namn = jack ålder = 29
När du deklarerar ett data klass genererar kompilatorn automatiskt flera funktioner såsom toString()
, equals()
, hashcode()
etc bakom kulisserna. Detta hjälper dig att hålla din kod kortfattad. Hade du använt Java skulle du behöva skriva en hel del pannkodskod.
Låt oss använda dessa funktioner:
Kopiering
För en dataklass kan du skapa en kopia av ett objekt med vissa av dess egenskaper olika med hjälp av copy()
funktionen. Så här fungerar det:
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)") )
När du kör programmet blir resultatet:
u1: namn = John, namn = 29 u2: namn = Randy, namn = 29
toString () -metod
Funktionen toString () returnerar en strängrepresentation av objektet.
data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) println(u1.toString()) )
När du kör programmet blir resultatet:
Användare (namn = John, ålder = 29)
hashCode () och är lika med ()
Den hasCode()
metoden returnerar hash-kod för objektet. Om två objekt är lika hashCode()
producerar samma heltalresultat. Rekommenderad läsning: hashCode ()
De equals()
återgår true
Om två objekt är lika (har samma hashCode()
). Om objekt inte är lika, equals()
returnerar false
. Rekommenderad läsning: är lika med ()
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.") )
När du kör programmet blir resultatet:
u1 hashcode = 71750738 u2 hashcode = 71750738 u3 hashcode = 771732263 u1 är lika med u2. u1 är inte lika med u3.
Förstöringsdeklarationer
Du kan förstöra ett objekt i ett antal variabler med hjälp av destruktionsdeklaration. Till exempel:
dataklass Användare (val namn: String, val age: Int, val kön: 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") )
När du kör programmet blir resultatet:
namn = John ålder = 29 kön = Man
Detta var möjligt eftersom kompilatorn genererar componentN()
funktioner alla egenskaper för en dataklass. Till exempel:
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" )
När du kör programmet blir resultatet:
Johannes 29 Man