Kotlinova datová třída

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 datavytvoř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()funkce equals()a hashCode()pár a toString()forma primárního konstruktoru
  • componentN() 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í) nebo var(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ž

Zajímavé články...