V tomto článku sa naučíte vytvárať triedy údajov v Kotline. Dozviete sa tiež o požiadavkách, ktoré musí spĺňať dátová trieda, a o ich štandardných funkciách.
Môže nastať situácia, keď budete musieť vytvoriť triedu iba na uchovanie údajov. V takýchto prípadoch môžete triedu označiť ako data
vytvorenie dátovej triedy. Napríklad,
dátová trieda Osoba (názov hodnoty: String, vek: Int)
Pre túto triedu kompilátor automaticky generuje:
copy()
funkciaequals()
ahashCode()
pár atoString()
forma primárneho konštruktoracomponentN()
funkcie
Predtým, ako sa budeme podrobne baviť o týchto funkciách, poďme si povedať o požiadavkách, ktoré musí spĺňať dátová trieda.
Požiadavky na dátovú triedu Kotlin
Tu sú požiadavky:
- Primárny konštruktor musí mať aspoň jeden parameter.
- Parametre primárneho konštruktora musia byť označené ako
val
(iba na čítanie) alebovar
(na čítanie a na zápis). - Trieda nemôže byť otvorená, abstraktná, vnútorná alebo zapečatená.
- Trieda môže rozširovať ďalšie triedy alebo implementovať rozhrania. Ak používate verziu Kotlin pred 1.1, trieda môže implementovať iba rozhrania.
Príklad: Kotlinská dátová trieda
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)") )
Po spustení programu bude výstup:
meno = jack vek = 29
Keď deklarujete triedu dát, kompilátor automaticky generuje niekoľko funkcií, napríklad toString()
, equals()
, hashcode()
atď zákulisí. To vám pomôže udržať váš kód stručný. Keby ste používali Java, museli by ste napísať veľa štandardných kódov.
Využime tieto funkcie:
Kopírovanie
Pre dátovú triedu môžete vytvoriť kópiu objektu s rôznymi vlastnosťami odlišnými pomocou copy()
funkcie. Funguje to takto:
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)") )
Po spustení programu bude výstup:
u1: meno = John, meno = 29 u2: meno = Randy, meno = 29
metóda toString ()
Funkcia toString () vráti reťazcovú reprezentáciu objektu.
data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) println(u1.toString()) )
Po spustení programu bude výstup:
Používateľ (meno = John, vek = 29)
hashCode () a equals ()
hasCode()
Metóda vráti hash kód pre daný objekt. Ak sú dva objekty rovnaké, hashCode()
vytvorí rovnaký celočíselný výsledok. Odporúčané čítanie: hashCode ()
Tieto equals()
vráti true
-Li dva objekty sú si rovné (má rovnaký hashCode()
). Ak objekty nie sú rovnaké, equals()
vráti sa false
. Odporúčané čítanie: rovná sa ()
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.") )
Po spustení programu bude výstup:
u1 hashcode = 71750738 u2 hashcode = 71750738 u3 hashcode = 771732263 u1 sa rovná u2. u1 sa nerovná u3.
Vyhlásenia o deštrukturalizácii
Objekt môžete zničiť na množstvo premenných pomocou deštrukčnej deklarácie. Napríklad:
dátová trieda User (názov valca: String, vek valca: Int, val rod: 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") )
Po spustení programu bude výstup:
meno = John vek = 29 pohlavie = muž
To bolo možné, pretože kompilátor generuje componentN()
funkcie všetky vlastnosti pre dátovú triedu. Napríklad:
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" )
Po spustení programu bude výstup:
Ján 29 Muž