Может ли дата класс в Kotlin иметь тело и функции внутри
Что проверяют
Не считаете ли вы data class контейнером, в котором запрещена любая логика, и знаете ли, что в нём разрешено, а что нет. Уточнение обычно такое: попадёт ли свойство из тела класса в equals() и copy().
Как отвечать
Да, у data class может быть обычное тело. Внутри допустимо почти всё, что в обычном классе:
- функции и вычисляемые свойства:
val isEmpty get() = items.isEmpty()вUiStateдля ViewModel выглядит естественно; - блоки
init: удобны для проверок черезrequire(), например что цена не отрицательная; - вторичные конструкторы: обязаны делегировать в первичный через
this(...); companion object, вложенные классы, интерфейсы: всё это работает как в обычном классе, наследоваться от открытого класса тоже можно.
Ограничения касаются самого объявления: у первичного конструктора должен быть хотя бы один параметр, все параметры помечены val или var, а класс не может быть abstract, open, sealed или inner. Свои equals(), hashCode() и toString() писать можно, тогда компилятор не генерирует свою версию. А вот copy() и componentN() объявлять явно запрещено.
Главное, что стоит сказать: сгенерированные методы видят только первичный конструктор. Свойство из тела не участвует в equals(), hashCode() и toString(), а copy() вызывает первичный конструктор, поэтому в копии такое свойство заново получит значение из инициализатора.
Про стиль: логика, которая описывает сами данные (форматирование, проверки, производные значения), в data class уместна. Зависимости вроде репозитория туда не кладут.
Где спотыкаются
Отвечают «нет, только данные» или «да» без единой оговорки. Интервьюер ждёт именно ограничений: что генерируется и из каких полей.
Хранят изменяемое состояние в var внутри тела. После copy() оно сбрасывается, в equals() не участвует, и StateFlow не отправит новое состояние, потому что оно равно старому.
Держат в data class ссылку на Context или колбэк. Такой объект перестаёт быть простыми данными, его неудобно сравнивать, а при хранении в ViewModel он легко превращается в утечку.