Что такое data-классы в Kotlin?

data class в Kotlin — это специальный тип классов, предназначенный для хранения данных. При объявлении data class компилятор автоматически генерирует полезные методы, такие как:

  • equals() — сравнение по содержимому

  • hashCode() — хэш-код на основе всех свойств

  • toString() — человекочитаемое строковое представление

  • copy() — создание копии объекта

  • componentN() — для деструктуризации

📦 Синтаксис

data class User(val name: String, val age: Int)

Компилятор сам создаст:

  • equals() → сравнит name и age

  • hashCode() → на основе name и age

  • toString() → User(name=..., age=...)

  • copy() → создаст копию с возможностью изменить часть полей

  • component1(), component2() → для деструктурирования

📌 Пример использования

val user1 = User("Alice", 30)
val user2 = User("Alice", 30)
println(user1 == user2) // true  сравнение по значению
val user3 = user1.copy(age = 35)
println(user3) // User(name=Alice, age=35)
val (name, age) = user1
println(name) // Alice
println(age) // 30

⚠️ Требования к data-классам

Чтобы класс можно было объявить как data, он должен соответствовать ряду требований:

  1. Конструктор должен содержать хотя бы один параметр.

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

  3. Нельзя делать abstract, open, sealed или inner data-классы.

  4. Если вы переопределяете equals(), hashCode() или toString(), они заменят сгенерированные.

🧠 Когда использовать data class

  • Когда класс предназначен только для хранения данных.

  • Когда нужен сравнительный и копирующий функционал "из коробки".

  • При работе с DTO, ViewModel, результатами запросов, ответами API и т.д.

🛠 Сравнение с обычным классом

class RegularUser(val name: String, val age: Int)
val a = RegularUser("Bob", 20)
val b = RegularUser("Bob", 20)
println(a == b) // false  сравнение по ссылке

А с data class:

data class DataUser(val name: String, val age: Int)
val x = DataUser("Bob", 20)
val y = DataUser("Bob", 20)
println(x == y) // true  сравнение по значению

📦 Пример copy()

val original = User("Alice", 30)
val modified = original.copy(age = 31)

→ Возвращает новый объект, не меняя оригинал (иммутабельность).

✅ Итого: преимущества data class

Особенность Описание
equals() Автоматическое сравнение по значениям свойств
--- ---
hashCode() Правильно работает в HashSet, HashMap, Map и т.д.
--- ---
toString() Удобный вывод в логах и отладке
--- ---
copy() Быстрое клонирование объекта с изменением нужных полей
--- ---
Деструктуризация Можно распаковывать в переменные через componentN()
--- ---

data class — это лаконичный способ описать модель данных в Kotlin, снижая количество шаблонного кода и повышая читаемость и надёжность.