У овом чланку ћете научити да креирате класе података у Котлину. Такође ћете научити о захтевима које класа података мора да испуњава и њиховим стандардним функционалностима.
Може доћи до ситуације у којој је потребно створити класу искључиво за чување података. У таквим случајевима можете да означите класу као data
да креира класу података. На пример,
класа података Особа (име вал: Стринг, вар аге: Инт)
За ову класу, компајлер аутоматски генерише:
copy()
функција,equals()
иhashCode()
пар, иtoString()
облик примарног конструктораcomponentN()
функције
Пре него што детаљно разговарамо о овим карактеристикама, хајде да разговарамо о захтевима које класа података мора да испуњава.
Котлин захтеви за класу података
Ево захтева:
- Примарни конструктор мора имати најмање један параметар.
- Параметри примарног конструктора морају бити означени као
val
(само за читање) илиvar
(за читање и писање). - Час не може бити отворен, апстрактан, унутрашњи или запечаћен.
- Класа може проширити друге класе или имплементирати интерфејсе. Ако користите верзију Котлин пре 1.1, класа може да имплементира само интерфејсе.
Пример: Котлин класа података
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)") )
Када покренете програм, излаз ће бити:
име = старост џека = 29
Када прогласи класу података, компајлер аутоматски генерише неколико функција, као што су toString()
, equals()
, hashcode()
итд иза сцене. Ово вам помаже да будете сажети. Да сте користили Јаву, требало би да напишете пуно узорка.
Користимо ове функције:
Копирање
За класу података можете да креирате копију објекта са неким од његових својстава која се разликују помоћу copy()
функције. Ево како то функционише:
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)") )
Када покренете програм, излаз ће бити:
у1: име = Џон, име = 29 у2: име = Ренди, име = 29
метода тоСтринг ()
Функција тоСтринг () враћа представљање објекта у низу.
data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) println(u1.toString()) )
Када покренете програм, излаз ће бити:
Корисник (име = Јохн, старост = 29)
хасхЦоде () и једнако ()
hasCode()
Метод врати хеш код за објекат. Ако су два објекта једнака, hashCode()
добија се исти цео резултат. Препоручено читање: хасхЦоде ()
У equals()
враћа true
ако два објекта су једнаки (има исти hashCode()
). Ако објекти нису једнаки, equals()
враћа се false
. Препоручена литература: једнако ()
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.") )
Када покренете програм, излаз ће бити:
у1 хасхцоде = 71750738 у2 хасхцоде = 71750738 у3 хасхцоде = 771732263 у1 је једнак у2. у1 није једнако у3.
Декларације о деструктурирању
Можете деструктурирати објекат у бројне променљиве помоћу деструктивне декларације. На пример:
класа података Корисник (вал име: Стринг, вал старост: Инт, вал пол: Стринг) fun main(args: Array) ( val u1 = User("John", 29, "Male") val (name, age, gender) = u1 println("name = $name") println("age = $age") println("gender = $gender") )
Када покренете програм, излаз ће бити:
име = Јован доб = 29 пол = мушко
То је било могуће јер компајлер генерише componentN()
функције сва својства за класу података. На пример:
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" )
Када покренете програм, излаз ће бити:
Јован 29 мушки