Класс данных
Иногда в программах приходится создавать классы исключительно для хранения данных, а затем — функции определенных стандартов внутри этих классов.
В Kotlin все эти проблемы решаются с помощью классов данных, создаваемых с той же целью, но функции определенных стандартов в них содержатся автоматически:
data class Person(val name: String, val surname: String)
Вот что нужно учитывать при создании класса данных.
- В нем принимается не менее одного параметра:
//У основного конструктора должен быть хотя бы один параметр.
data class Person(val atLeastOneParameter: String)
2. Когда мы формируем эти классы, в фоновом режиме генерируются функции equals()
, hashCode()
, toString()
, copy()
и componentN()
:
В точном эквиваленте этого Kotlin-кода на Java функции будут сгенерированы автоматически.
3. Если мы переопределим эти автоматически сгенерированные функции классов данных и напишем их сами, вместо автоматически сгенерированных функций в фоновом режиме напишутся функции, которые мы написали.
Но эти функции сгенерируются только для переменных внутри основного конструктора. Переменные, определенные внутри класса данных, не включаются в эти пользовательские сгенерированные функции:
4. Параметры, определенные в основном конструкторе класса данных, должны определяться с VAL или VAR.
Потому что в таких функциях, как toString()
, специально генерируемых в классе данных, используются переменные, определенные в основном конструкторе. Функциям нужен доступ к этим переменным.
Если мы определяем без 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
Заключение
Классы данных — это структуры для хранения данных и генерирования определенных функций по умолчанию, создаваемых фактически с учетом имеющихся особенностей. В том, что касается хранения данных, самое большое отличие класса данных от обычного класса — это автоматическое создание функций в фоновом режиме.
Читайте также:
Читайте нас в Telegram, VK и Дзен
Перевод статьи Hüseyin Özkoç: 👨🏼💻Kotlin Data Class