Может ли data class в Kotlin иметь пустой конструктор
Что проверяют
Знаете ли вы требования компилятора к data class и понимаете ли, зачем нужен конструктор без аргументов. Вопрос выглядит придиркой к синтаксису, но за ним практика: сериализаторы и ORM создают объект без параметров. Следом спрашивают, что именно генерирует компилятор и по каким полям.
Как отвечать
Прямой ответ: нет, первичный конструктор data class обязан иметь хотя бы один параметр, data class Empty не соберётся. Каждый такой параметр объявляется как val или var.
Дальше покажите, что поняли вопрос шире.
- вторичный конструктор без аргументов возможен:
data class User(val name: String, val age: Int) { constructor() : this("", 0) }. Законный способ отдать фреймворку то, что он просит; - значения по умолчанию для всех параметров дают то же самое проще:
data class User(val name: String = "", val age: Int = 0). На JVM компилятор тогда генерирует дополнительный конструктор без параметров, и Jackson или Firebase создаёт экземпляр рефлексией; - для JPA есть плагин
kotlin-noargв вариантеkotlin-jpa, он дописывает такой конструктор синтетически. Правда, сущности JPA лучше не делать датаклассами: сгенерированныеequalsиhashCodeломаются на ленивых прокси и изменяемом идентификаторе; - если нужен тип без данных, берите
data objectиз Kotlin 1.9. Он даёт осмысленныйtoStringи единственный экземпляр, чего и хотят от «пустого» датакласса в состояниях экрана.
Закончите тем, что генерируется: equals, hashCode, toString, copy и componentN, причём только по параметрам первичного конструктора. Свойство, объявленное в теле класса, в сравнение и в вывод не попадёт, и про это спрашивают отдельным подвопросом.
Где спотыкаются
Отвечают «да, можно» по аналогии с обычным классом. Обычный class Empty компилируется, data class Empty нет.
Думают, что умолчания сами по себе делают конструктор без аргументов видимым везде. Из Kotlin вызов User() работает, когда умолчания есть у всех параметров, а Java при частичных умолчаниях получает только синтетический конструктор с битовой маской.
Забывают про свойства в теле класса и удивляются, почему два объекта с разным состоянием оказались равны.