Что такое 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, он должен соответствовать ряду требований:
-
Конструктор должен содержать хотя бы один параметр.
-
Все параметры конструктора должны быть помечены как val или var.
-
Нельзя делать abstract, open, sealed или inner data-классы.
-
Если вы переопределяете 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, снижая количество шаблонного кода и повышая читаемость и надёжность.