V tomto článku se naučíte vytvářet datové třídy v Kotlin. Dozvíte se také o požadavcích, které musí třída dat splňovat, a o jejich standardních funkcích.
Může nastat situace, kdy budete muset vytvořit třídu pouze pro uchování dat. V takových případech můžete označit třídu jako data
vytvořit datovou třídu. Například,
datová třída Osoba (název hodnoty: Řetězec, různý věk: Int)
Pro tuto třídu kompilátor automaticky generuje:
copy()
funkceequals()
ahashCode()
pár atoString()
forma primárního konstruktorucomponentN()
funkce
Než budeme podrobně hovořit o těchto funkcích, promluvme si o požadavcích, které musí třída dat splňovat.
Požadavky na datovou třídu Kotlin
Zde jsou požadavky:
- Primární konstruktor musí mít alespoň jeden parametr.
- Parametry primárního konstruktoru musí být označeny jako
val
(pouze pro čtení) nebovar
(pro čtení a zápis). - Třída nemůže být otevřená, abstraktní, vnitřní nebo zapečetěná.
- Třída může rozšířit další třídy nebo implementovat rozhraní. Pokud používáte verzi Kotlin před 1.1, může třída implementovat pouze rozhraní.
Příklad: Kotlinova datová třída
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)") )
Když spustíte program, výstup bude:
name = jack age = 29
Když deklarujete třídu dat, kompilátor automaticky generuje několik funkcí, například toString()
, equals()
, hashcode()
atd zákulisí. Díky tomu budete mít kód stručný. Pokud jste použili Javu, budete muset napsat hodně standardizovaného kódu.
Pojďme použít tyto funkce:
Kopírování
U datové třídy můžete vytvořit kopii objektu s různými jeho vlastnostmi odlišnými pomocí copy()
funkce. 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)") )
Když spustíte program, výstup bude:
u1: name = John, name = 29 u2: name = Randy, name = 29
metoda toString ()
Funkce toString () vrací řetězcovou reprezentaci objektu.
data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) println(u1.toString()) )
Když spustíte program, výstup bude:
Uživatel (jméno = John, věk = 29)
hashCode () a equals ()
hasCode()
Metoda vrátí hash kód pro daný objekt. Pokud jsou dva objekty stejné, hashCode()
vytvoří stejný celočíselný výsledek. Doporučené čtení: hashCode ()
Tyto equals()
vrátí true
-li dva objekty jsou si rovny (má stejný hashCode()
). Pokud objekty nejsou stejné, equals()
vrátí se false
. Doporučená literatura: equals ()
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.") )
Když spustíte program, výstup bude:
u1 hashcode = 71750738 u2 hashcode = 71750738 u3 hashcode = 771732263 u1 se rovná u2. u1 se nerovná u3.
Prohlášení o restrukturalizaci
Pomocí destrukční deklarace můžete objekt zničit na řadu proměnných. Například:
datová třída Uživatel (název úrovně: Řetězec, věk věku: Int, pohlaví pohlaví: Řetězec) fun main(args: Array) ( val u1 = User("John", 29, "Male") val (name, age, gender) = u1 println("name = $name") println("age = $age") println("gender = $gender") )
Když spustíte program, výstup bude:
jméno = John věk = 29 pohlaví = muž
To bylo možné, protože kompilátor generuje componentN()
funkce všechny vlastnosti pro datovou třídu. Napří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" )
Když spustíte program, výstup bude:
Jan 29 Muž