V tem članku se boste naučili ustvarjati podatkovne razrede v Kotlinu. Spoznali boste tudi zahteve, ki jih mora izpolnjevati podatkovni razred, in njihove standardne funkcije.
Lahko pride do situacije, ko morate ustvariti razred samo za hrambo podatkov. V takih primerih lahko razred označite kot data
ustvarjanje podatkovnega razreda. Na primer
podatkovni razred Oseba (ime valu: Niz, spremenljivka: Int)
Za ta razred prevajalnik samodejno ustvari:
copy()
funkcija,equals()
inhashCode()
par, intoString()
obliko primarnega konstruktorjacomponentN()
funkcije
Preden se podrobno pogovorimo o teh funkcijah, se pogovorimo o zahtevah, ki jih mora izpolnjevati podatkovni razred.
Zahteve glede podatkovnega razreda Kotlin
Tu so zahteve:
- Primarni konstruktor mora imeti vsaj en parameter.
- Parametri primarnega konstruktorja morajo biti označeni kot
val
(samo za branje) alivar
(branje in pisanje). - Predavanja ne morejo biti odprta, abstraktna, notranja ali zapečatena.
- Razred lahko razširja druge razrede ali izvaja vmesnike. Če uporabljate različico Kotlin pred 1.1, lahko razred izvaja samo vmesnike.
Primer: Kotlinov podatkovni razred
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)") )
Ko zaženete program, bo rezultat:
ime = starost jacka = 29
Ko razglasite podatkovni razred, prevajalnik samodejno ustvari več funkcij, kot toString()
so equals()
, hashcode()
itd. To vam pomaga ohranjati jedrnato kodo. Če bi uporabljali Javo, bi morali napisati veliko vzorčne kode.
Uporabimo te funkcije:
Kopiranje
Za podatkovni razred lahko s copy()
funkcijo ustvarite kopijo predmeta z nekaterimi lastnostmi, ki se razlikujejo . Tako deluje:
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)") )
Ko zaženete program, bo rezultat:
u1: ime = John, ime = 29 u2: ime = Randy, ime = 29
metoda toString ()
Funkcija toString () vrne nizovno predstavitev predmeta.
data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) println(u1.toString()) )
Ko zaženete program, bo rezultat:
Uporabnik (ime = John, starost = 29)
hashCode () in enako ()
hasCode()
Metoda vrne hash koda za objekt. Če sta dva predmeta enaka, hashCode()
dobimo enak celoštevilski rezultat. Priporočeno branje: hashCode ()
Se equals()
vrne true
če dveh objektov so enaki (je enako hashCode()
). Če predmeti niso enaki, se equals()
vrne false
. Priporočeno branje: enako ()
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.") )
Ko zaženete program, bo rezultat:
u1 hashcode = 71750738 u2 hashcode = 71750738 u3 hashcode = 771732263 u1 je enako u2. u1 ni enako u3.
Izjave o destrukturiranju
Predmet lahko destrukturirate v številne spremenljivke z uporabo destruktivne deklaracije. Na primer:
podatkovni razred Uporabnik (ime valu: String, val starost: Int, val spol: niz) fun main(args: Array) ( val u1 = User("John", 29, "Male") val (name, age, gender) = u1 println("name = $name") println("age = $age") println("gender = $gender") )
Ko zaženete program, bo rezultat:
ime = John starost = 29 spol = moški
To je bilo mogoče, ker prevajalnik ustvari componentN()
funkcije vseh lastnosti za podatkovni razred. Na primer:
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" )
Ko zaženete program, bo rezultat:
Janez 29 Moški