I denne artikel lærer du at oprette dataklasser i Kotlin. Du vil også lære om krav, som dataklassen skal opfylde, og deres standardfunktioner.
Der kan opstå en situation, hvor du kun skal oprette en klasse for at holde data. I sådanne tilfælde kan du markere klassen for data
at oprette en dataklasse. For eksempel,
dataklasse Person (val navn: String, var alder: Int)
For denne klasse genererer compileren automatisk:
copy()
funktionequals()
oghashCode()
par ogtoString()
form af den primære konstruktørcomponentN()
funktioner
Før vi taler om disse funktioner i detaljer, lad os tale om krav, som en dataklasse skal opfylde.
Kotlin-dataklassekrav
Her er kravene:
- Den primære konstruktør skal have mindst en parameter.
- Parametrene for den primære konstruktør skal markeres som enten
val
(skrivebeskyttet) ellervar
(læse-skriv). - Klassen kan ikke være åben, abstrakt, indre eller forseglet.
- Klassen kan udvide andre klasser eller implementere grænseflader. Hvis du bruger Kotlin-version før 1.1, kan klassen kun implementere grænseflader.
Eksempel: Kotlin-dataklasse
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ører programmet, vil output være:
navn = jack alder = 29
Når du erklærer en data klasse, compileren genererer automatisk flere funktioner såsom toString()
, equals()
, hashcode()
etc bag kulisserne. Dette hjælper med at holde din kode kortfattet. Hvis du havde brugt Java, skal du skrive en masse kedelpladekode.
Lad os bruge disse funktioner:
Kopiering
For en dataklasse kan du oprette en kopi af et objekt med nogle af dets egenskaber forskellige ved hjælp af copy()
funktionen. Sådan fungerer 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ører programmet, vil output være:
u1: navn = John, navn = 29 u2: navn = Randy, navn = 29
toString () metode
Funktionen toString () returnerer en strengrepræsentation af 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ører programmet, vil output være:
Bruger (navn = John, alder = 29)
hashCode () og er lig med ()
Den hasCode()
returnerer fremgangsmåden hashkode for objektet. Hvis to objekter er ens, hashCode()
producerer det samme heltalresultat. Anbefalet læsning: hashCode ()
De equals()
vender tilbage true
, hvis to objekter er ens (har samme hashCode()
). Hvis objekter ikke er ens, equals()
vender tilbage false
. Anbefalet læsning: er lig 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ører programmet, vil output være:
u1 hashcode = 71750738 u2 hashcode = 71750738 u3 hashcode = 771732263 u1 er lig med u2. u1 er ikke lig med u3.
Erklæringer om destruktion
Du kan destruere et objekt i et antal variabler ved hjælp af destruktionserklæring. For eksempel:
dataklasse bruger (val navn: streng, val alder: int, val køn: streng) 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ører programmet, vil output være:
navn = John alder = 29 køn = mand
Dette var muligt, fordi compileren genererer componentN()
funktioner alle egenskaber for en dataklasse. For eksempel:
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ører programmet, vil output være:
Johannes 29 Mand