Класс данных Kotlin

В этой статье вы научитесь создавать классы данных в 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, мужчина

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