U ovom ćete članku naučiti stvoriti klase podataka u Kotlinu. Također ćete naučiti o zahtjevima koje klasa podataka mora ispunjavati i njihovim standardnim funkcionalnostima.
Može doći do situacije da klasu trebate stvoriti isključivo za čuvanje podataka. U takvim slučajevima možete označiti klasu kao data
da stvara klasu podataka. Na primjer,
podatkovna klasa Osoba (val ime: Niz, varijabla: Int)
Za ovu klasu, kompajler automatski generira:
copy()
funkcijaequals()
ihashCode()
par itoString()
oblik primarnog konstruktoracomponentN()
funkcije
Prije nego što detaljno razgovaramo o ovim značajkama, razgovarajmo o zahtjevima koje klasa podataka mora ispunjavati.
Zahtjevi za razred podataka Kotlin
Evo zahtjeva:
- Primarni konstruktor mora imati barem jedan parametar.
- Parametri primarnog konstruktora moraju biti označeni kao
val
(samo za čitanje) ilivar
(za čitanje i pisanje). - Predavanje ne može biti otvoreno, apstraktno, unutarnje ili zatvoreno.
- Klasa može proširiti druge klase ili implementirati sučelja. Ako koristite verziju Kotlin prije 1.1, klasa može implementirati samo sučelja.
Primjer: 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)") )
Kada pokrenete program, izlaz će biti:
ime = dob jacka = 29
Kada proglasiti klasu podataka, prevodilac automatski generira nekoliko funkcija, kao što su toString()
, equals()
, hashcode()
i sl iza scene. To vam pomaže održati sažeti kod. Da ste koristili Javu, trebali biste napisati puno standardnih kodova.
Koristimo ove funkcije:
Kopiranje
Za podatkovnu klasu možete stvoriti kopiju objekta s nekim od njegovih svojstava koja se razlikuju pomoću copy()
funkcije. Evo kako to funkcionira:
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)") )
Kada pokrenete program, izlaz će biti:
u1: ime = John, ime = 29 u2: ime = Randy, ime = 29
metoda toString ()
Funkcija toString () vraća predstavljanje objekta u nizu.
data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) println(u1.toString()) )
Kada pokrenete program, izlaz će biti:
Korisnik (ime = John, dob = 29)
hashCode () i jednako ()
hasCode()
Metoda vraća hash broj za objekt. Ako su dva objekta jednaka, hashCode()
daje se isti cijeli broj. Preporučena literatura: hashCode ()
U equals()
vraća true
ako dva objekta jednaka (ima isti hashCode()
). Ako objekti nisu jednaki, equals()
vraća se false
. Preporučena literatura: jednako ()
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.") )
Kada pokrenete program, izlaz će biti:
u1 hashcode = 71750738 u2 hashcode = 71750738 u3 hashcode = 771732263 u1 je jednak u2. u1 nije jednako u3.
Deklaracije o destrukturiranju
Objekt možete destrukturirati u brojne varijable pomoću destruktivne deklaracije. Na primjer:
podatkovna klasa Korisnik (val ime: String, val dob: Int, val spol: 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") )
Kada pokrenete program, izlaz će biti:
ime = Ivan dob = 29 spol = muško
To je bilo moguće jer prevoditelj generira componentN()
funkcije sva svojstva za klasu podataka. Na primjer:
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" )
Kada pokrenete program, izlaz će biti:
Ivan 29 muški