Клас данни на Kotlin

В тази статия ще се научите да създавате класове данни в Kotlin. Също така ще научите за изискванията, които класът данни трябва да изпълнява, и техните стандартни функционалности.

Може да възникне ситуация, при която трябва да създадете клас единствено за съхранение на данни. В такива случаи можете да маркирате класа като dataсъздаващ клас данни. Например,

 клас данни Лице (име на вал: String, вариация: Int)

За този клас компилаторът автоматично генерира:

  • copy()функция equals()и hashCode()двойка и toString()форма на първичния конструктор
  • componentN() функции

Преди да говорим подробно за тези функции, нека поговорим за изискванията, които даден клас данни трябва да изпълнява.

Изисквания за клас данни на Kotlin

Ето изискванията:

  • Първичният конструктор трябва да има поне един параметър.
  • Параметрите на първичния конструктор трябва да бъдат маркирани като val(само за четене) или var(четене-запис).
  • Класът не може да бъде отворен, абстрактен, вътрешен или запечатан.
  • Класът може да разшири други класове или да реализира интерфейси. Ако използвате версия Kotlin преди 1.1, класът може да реализира само интерфейси.

Пример: Клас данни на Kotlin

 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()т.н. зад кулисите. Това ви помага да поддържате кратък код. Ако сте използвали Java, ще трябва да напишете много шаблонни кодове.

Нека използваме тези функции:

Копиране

За клас данни можете да създадете копие на обект с някои от неговите свойства, различни с помощта на 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)") )

Когато стартирате програмата, изходът ще бъде:

 u1: име = Джон, име = 29 u2: име = Ранди, име = 29

метод toString ()

Функцията toString () връща низово представяне на обекта.

 data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) println(u1.toString()) )

Когато стартирате програмата, изходът ще бъде:

 Потребител (име = Джон, възраст = 29)

hashCode () и е равно ()

В hasCode()метод връща код за сегментиране на обекта. Ако два обекта са равни, се hashCode()получава един и същ цяло число резултат. Препоръчително четене: 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.") )

Когато стартирате програмата, изходът ще бъде:

u1 hashcode = 71750738 u2 hashcode = 71750738 u3 hashcode = 771732263 u1 е равно на u2. u1 не е равно на u3.

Декларации за деструктуриране

Можете да деструктурирате обект в редица променливи, като използвате деструктираща декларация. Например:

 клас данни Потребител (име на val: String, val възраст: Int, val пол: 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") )

Когато стартирате програмата, изходът ще бъде:

 име = Джон възраст = 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 Мъж

Интересни статии...