Что такое data class и какие у них особенности?
В Kotlin data class — это специальный вид класса, предназначенный для хранения данных. Он автоматически генерирует полезные методы, такие как equals(), hashCode(), toString(), copy() и componentN(), избавляя разработчика от рутинного кода.
📦 Пример data class
data class User(val name: String, val age: Int)
🔍 Особенности и поведение
1. Автоматически сгенерированные методы
Компилятор Kotlin создаёт за вас:
-
equals() — сравнение по содержимому.
-
hashCode() — хэш-код на основе всех свойств.
-
toString() — удобный вывод: User(name=Anna, age=25).
-
copy() — клонирование объекта с возможностью изменения некоторых свойств.
-
component1(), component2() и т.д. — для деструктуризации.
Пример:
val user1 = User("Anna", 25)
val user2 = user1.copy(age = 30)
println(user2) // User(name=Anna, age=30)
val (name, age) = user1
println(name) // Anna
2. Требования к data class
Чтобы класс можно было объявить как data, он должен:
-
Иметь хотя бы один параметр в первичном конструкторе.
-
Все параметры конструктора, используемые для автогенерации, должны быть помечены как val или var.
-
Не должен быть abstract, open, sealed или inner.
data class Invalid(val a: Int) {
var x = 0 // допустимо, но x не участвует в equals/hashCode
}
3. Сравнение объектов
В data class переопределён equals():
val user1 = User("Anna", 25)
val user2 = User("Anna", 25)
println(user1 == user2) // true — сравнение по содержимому
А в обычных классах сравнение происходит по ссылке (===).
4. Copy — клонирование с изменением
val original = User("Max", 20)
val updated = original.copy(age = 21)
copy() создаёт новый объект, что удобно при работе с неизменяемыми структурами (immutable).
5. Деструктуризация
Автоматически создаются методы componentN() для использования в деструктурированных выражениях:
val user = User("Ira", 19)
val (name, age) = user
🔐 Ограничения
-
data class не поддерживает наследование (кроме интерфейсов).
-
Если в классе есть поля вне конструктора, они не участвуют в equals(), hashCode(), copy() и деструктуризации.
-
Если вы переопределите equals() или hashCode() вручную — генерация по умолчанию будет отключена.
🧠 Когда использовать data class
Используйте data class, если:
-
Класс не содержит логики, а просто представляет данные.
-
Вы хотите сравнивать объекты по содержимому, а не по ссылке.
-
Вам нужно удобно копировать и деструктурировать объекты.
-
Вы работаете с слоями данных, DTO, UI-состоянием.
✅ Примеры реального применения
-
Модели данных из API (User, Post, Product)
-
UI-состояние в Compose или ViewModel
-
Результаты обработки (Result, Response)
-
DTO и сущности в слоях Domain/Data
Итого
data class — это лаконичный и мощный инструмент в Kotlin, предназначенный для представления и работы с данными. Он автоматизирует генерацию часто используемых методов и делает код чистым, безопасным и легко поддерживаемым.