Класс данных

Иногда в программах приходится создавать классы исключительно для хранения данных, а затем  —  функции определенных стандартов внутри этих классов.

В Kotlin все эти проблемы решаются с помощью классов данных, создаваемых с той же целью, но функции определенных стандартов в них содержатся автоматически:


data class Person(val name: String, val surname: String)

Вот что нужно учитывать при создании класса данных.

  1. В нем принимается не менее одного параметра:
//У основного конструктора должен быть хотя бы один параметр.
data class Person(val atLeastOneParameter: String)

2. Когда мы формируем эти классы, в фоновом режиме генерируются функции equals(), hashCode(), toString(), copy() и componentN():

Tools («Инструменты») -> Kotlin -> Show Kotlin Bytecode («Показать байт-код Kotlin») -> Decompile («Декомпилировать»)

В точном эквиваленте этого Kotlin-кода на Java функции будут сгенерированы автоматически.


3. Если мы переопределим эти автоматически сгенерированные функции классов данных и напишем их сами, вместо автоматически сгенерированных функций в фоновом режиме напишутся функции, которые мы написали.

Но эти функции сгенерируются только для переменных внутри основного конструктора. Переменные, определенные внутри класса данных, не включаются в эти пользовательские сгенерированные функции:

Переменная-член (randomVariable), определяемая в классе, не используется в автоматически сгенерированных функциях

4. Параметры, определенные в основном конструкторе класса данных, должны определяться с VAL или VAR.

Потому что в таких функциях, как toString(), специально генерируемых в классе данных, используются переменные, определенные в основном конструкторе. Функциям нужен доступ к этим переменным.

Если мы определяем без Val и Var, у этих методов не будет доступа к этим значениям, так как не будет доступа к значениям внутри класса:

Основной конструктор класса данных должен определяться с VAL или VAR

5. Класс данных не может быть открытым, абстрактным, запечатанным, внутренним:

Класс не может быть открытым, абстрактным, запечатанным, внутренним

6. У классов данных ключевое слово по умолчанию  —  final. Поэтому они не наследуются:

Классы данных не наследуются

7. Однако от другого или абстрактного класса они наследуются. Более того, они могут реализовывать интерфейсы:

interface InterfaceExample {

fun fromInterface()

}

abstract class AbstractExample {

abstract fun fromAbstract()

}

data class Person(val atLeastOneParameter: String):AbstractExample(),InterfaceExample {

var randomVariable: String = "Random"

override fun fromInterface() {
TODO("Not yet implemented")
}

override fun fromAbstract() {
TODO("Not yet implemented")
}

}


8. Благодаря классам данных создаются объявления деструктурирования с автоматически сгенерированными функциями componentN:

val jane = User("Jane", 35)
val (name, age) = jane
println("$name, $age years of age") // выводится Jane, 35 years of age

Заключение

Классы данных  —  это структуры для хранения данных и генерирования определенных функций по умолчанию, создаваемых фактически с учетом имеющихся особенностей. В том, что касается хранения данных, самое большое отличие класса данных от обычного класса  —  это автоматическое создание функций в фоновом режиме.

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи Hüseyin Özkoç: 👨🏼‍💻Kotlin Data Class

Предыдущая статьяСоздание пользовательских хуков React: полное руководство
Следующая статьяОбъекты данных в Kotlin