Что такое 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, предназначенный для представления и работы с данными. Он автоматизирует генерацию часто используемых методов и делает код чистым, безопасным и легко поддерживаемым.