Что такое data классы в Kotlin?
Data-классы в Kotlin — это специальные классы, предназначенные для хранения данных. Они автоматически получают реализацию полезных методов, таких как equals(), hashCode(), toString(), copy(), а также компоненты для деструктуризации (component1(), component2() и т.д.).
Data-классы существенно снижают количество шаблонного (boilerplate) кода, который в Java приходится писать вручную при создании POJO (Plain Old Java Object).
🔹 Как объявляется data-класс
data class User(val name: String, val age: Int)
Это создаёт полноценный класс с:
-
val name
-
val age
-
методами equals(), hashCode(), toString()
-
методом copy()
-
методами component1(), component2() для деструктуризации
🧠 Что генерирует компилятор
Для data class User(val name: String, val age: Int) компилятор автоматически создаёт:
1. equals() и hashCode()
Сравниваются все свойства из первичного конструктора:
val u1 = User("Alice", 25)
val u2 = User("Alice", 25)
println(u1 == u2) // true
2. toString()
Пример:
println(u1) // User(name=Alice, age=25)
3. copy()
Создаёт копию объекта с возможностью изменить отдельные поля:
val u3 = u1.copy(age = 30)
4. componentN() для деструктуризации
Позволяет извлекать значения из объекта как из кортежа:
val (name, age) = u1
📋 Требования к data-классам
-
Должен иметь хотя бы один параметр в primary constructor.
-
Все параметры должны быть val или var.
-
Не может быть abstract, open, sealed, inner.
-
Можно добавлять свойства/методы вне конструктора, но они не участвуют в equals/hashCode.
🔍 Пример использования
data class Product(val id: Int, val name: String, val price: Double)
val p1 = Product(1, "Phone", 999.0)
val p2 = p1.copy(price = 899.0)
println(p1 == p2) // false
⚠️ Особенности
-
Только поля из primary constructor участвуют в equals, hashCode, copy, componentN.
-
Data-класс может наследовать/реализовывать интерфейсы.
-
Можно переопределять генерируемые методы вручную.
-
Если указать val/var вне конструктора — такие поля игнорируются при сравнении и копировании.
✅ Когда использовать data-классы
-
Для хранения данных без логики.
-
В моделях: DTO, запросы/ответы API, сущности БД.
-
При использовании коллекций, мапов, фильтрации.
-
Вместо обычных Java POJO.
Таким образом, data class в Kotlin — мощный инструмент, позволяющий создавать лаконичные и читаемые классы для хранения данных, устраняя необходимость ручной реализации рутинных методов. Это делает код чище, безопаснее и легче поддерживаемым.