В этой статье вы научитесь создавать классы данных в Kotlin. Вы также узнаете о требованиях, которым должен соответствовать класс данных, и об их стандартных функциях.
Может возникнуть ситуация, когда вам нужно создать класс исключительно для хранения данных. В таких случаях вы можете пометить класс как data
создающий класс данных. Например,
класс данных Person (val name: String, var age: 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)") )
Когда вы запустите программу, вывод будет:
name = 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: name = John, name = 29 u2: name = Рэнди, name = 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 () и equals ()
hasCode()
Метод возвращает хэш - код для объекта. Если два объекта равны, hashCode()
дает одинаковый целочисленный результат. Рекомендуемая литература: hashCode ()
В equals()
возвращается , true
если два объекта равны (есть же hashCode()
). Если объекты не равны, equals()
возвращается false
. Рекомендуемая литература: 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.") )
Когда вы запустите программу, вывод будет:
u1 hashcode = 71750738 u2 hashcode = 71750738 u3 hashcode = 771732263 u1 равен u2. u1 не равно u3.
Заявления о разрушении
Вы можете деструктурировать объект на несколько переменных, используя деструктивное объявление. Например:
класс данных User (имя 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, мужчина