Что такое 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-классам

  1. Должен иметь хотя бы один параметр в primary constructor.

  2. Все параметры должны быть val или var.

  3. Не может быть abstract, open, sealed, inner.

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