Tässä artikkelissa opit luomaan dataluokkia Kotlinissa. Opit myös vaatimuksista, jotka tietoluokan on täytettävä, ja niiden vakiotoiminnoista.
Saattaa syntyä tilanne, jossa sinun on luotava luokka vain tietojen säilyttämiseksi. Tällaisissa tapauksissa voit merkitä luokan data
luomaan tietoluokan. Esimerkiksi,
tietoluokka Henkilö (val-nimi: Merkkijono, vaihteleva ikä: Int)
Tälle luokalle kääntäjä luo automaattisesti:
copy()
toiminto,equals()
jahashCode()
pari, jatoString()
muoto ensisijaisen rakentajacomponentN()
toimintoja
Ennen kuin puhumme näistä ominaisuuksista yksityiskohtaisesti, puhutaan vaatimuksista, jotka tietoluokan on täytettävä.
Kotlin-tietoluokan vaatimukset
Tässä ovat vaatimukset:
- Ensisijaisella rakentajalla on oltava vähintään yksi parametri.
- Ensisijaisen rakentajan parametrit on merkittävä joko
val
(vain luku) taivar
(luku-kirjoitus). - Luokka ei voi olla avoin, abstrakti, sisäinen tai sinetöity.
- Luokka voi laajentaa muita luokkia tai toteuttaa rajapintoja. Jos käytät Kotlin-versiota ennen 1.1, luokka voi toteuttaa vain rajapintoja.
Esimerkki: Kotlin-tietoluokka
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)") )
Kun suoritat ohjelmaa, tulos on:
nimi = jack ikä = 29
Kun julistaa Dataluokka, kääntäjä luo automaattisesti useita toimintoja, kuten toString()
, equals()
, hashcode()
jne kulissien takana. Tämä auttaa pitämään koodisi ytimekkäänä. Jos olisit käyttänyt Java-ohjelmaa, sinun olisi kirjoitettava paljon kattilakoodia.
Käytetään näitä toimintoja:
Kopiointi
Dataluokalle voit luoda kopion objektista, jonka ominaisuudet ovat erilaiset copy()
funktion avulla. Näin se toimii:
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)") )
Kun suoritat ohjelmaa, tulos on:
u1: nimi = John, nimi = 29 u2: nimi = Randy, nimi = 29
toString () -menetelmä
ToString () -funktio palauttaa objektin merkkijonon.
data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) println(u1.toString()) )
Kun suoritat ohjelmaa, tulos on:
Käyttäjä (nimi = John, ikä = 29)
hashCode () ja on yhtä suuri ()
hasCode()
Menetelmä palaa hajotuskoodilla objektin. Jos kaksi objektia on yhtä suuri, hashCode()
tuottaa saman kokonaislukutuloksen. Suositeltava lukeminen: hashCode ()
equals()
Palaa true
jos kaksi objektia samoja (on sama hashCode()
). Jos objektit eivät ole samanarvoisia, equals()
palaa false
. Suositeltava lukema: on yhtä suuri ()
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.") )
Kun suoritat ohjelmaa, tulos on:
u1 hashcode = 71750738 u2 hashcode = 71750738 u3 hashcode = 771732263 u1 on yhtä suuri kuin u2. u1 ei ole yhtä suuri kuin u3.
Uudelleenjärjestelyilmoitukset
Voit tuhota objektin useiksi muuttujiksi tuhoavan ilmoituksen avulla. Esimerkiksi:
tietoluokka Käyttäjä (val-nimi: merkkijono, val-ikä: Int, val sukupuoli: Merkkijono) fun main(args: Array) ( val u1 = User("John", 29, "Male") val (name, age, gender) = u1 println("name = $name") println("age = $age") println("gender = $gender") )
Kun suoritat ohjelmaa, tulos on:
nimi = John ikä = 29 sukupuoli = mies
Tämä oli mahdollista, koska kääntäjä luo componentN()
toiminnot kaikki ominaisuudet tietoluokalle. Esimerkiksi:
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" )
Kun suoritat ohjelmaa, tulos on:
Johannes 29 Mies