В Kotlin data class предназначены для хранения данных. Компилятор автоматически генерирует для них методы equals(), hashCode(), toString(), а также функции copy() и componentN(), которые существенно облегчают работу с такими объектами:
data class User(val name: String, val age: Int) val u1 = User("Ivan", 30) val u2 = u1.copy(age = 31)
Обычные классы не имеют таких автогенерированных методов; всё пишется вручную. Data class лучше использовать для DTO, моделей и структур данных.
Ограничения data class:
val или var.abstract, open, sealed или inner."Можно ли объявить data class с наследованием от другого data class? Зачем (или почему нельзя)?"
Нет, нельзя напрямую наследовать один data class от другого. Data class может наследоваться только от интерфейса или обычного класса (не data class). Это сделано для предотвращения путаницы с автогенерируемыми методами (например, копирование наследуемых свойств неочевидно).
data class Base(val id: Int) data class Child(val name: String) : Base(1) // Ошибка компиляции: не разрешено
История
В банковском проекте использовали data class с бизнес-логикой и наследованием. После добавления нового поля стало невозможно корректно копировать объекты, часть бизнес-логики потерялась (методы не были унаследованы), что привело к ошибкам в расчетах комиссий.
История
В e-commerce платформе data class использовался для хранения состояния корзины пользователя. После обновления состояния через
copy(), забыли, что внутренние списки не копируются глубоко. Из-за этого происходило "утекание" данных между сессиями пользователей.
История
В проекте с интеграцией внешнего API сериализация data class в JSON приводила к появлению полей с приватным видимостью, что нарушало контракт API и приводило к ошибкам на стороне клиента.