Почему должно быть хотя бы одно поле в конструкторе data class

Ответ

Data class в Kotlin автоматически генерирует equals(), hashCode(), toString(), copy() и методы компонентов. Если в data class нет полей, эти методы теряют смысл, так как нечего сравнивать, хэшировать или копировать.

Пример:

data class Empty()  // Ошибка: Data class must have at least one primary constructor parameter

Без полей data class становится бессмысленным — он не хранит данных, ради которых создан. В таком случае лучше использовать обычный class или object.

Ответ 18+ 🔞

Э, слушай, а вот тут история интересная вырисовывается. Представь себе: ты такой, весь из себя крутой, объявляешь data class в Kotlin, ожидая, что тебе автоматом нагенерируют кучу полезных методов — equals, hashCode, toString, copy. Мечта, а не класс! Но потом такой: «А поля-то я забыл добавить».

И тут начинается ёперный театр. Компилятор смотрит на твой data class Empty() и просто охуевает. «Мужик, — говорит он, — ты чего творишь? Data class — он же для данных! Где сами-то данные, ёпта? Что я буду сравнивать в equals? Воздух? Что копировать в copy()? Твои пустые надежды?»

И бац — ошибка: Data class must have at least one primary constructor parameter. Честно говоря, логично, как ни крути. Зачем тебе data class, который нихуя не хранит? Это как купить крутейший спортивный автомобиль, а у него двигателя нет. Стоит, бля, красивый, а поехать — хуй с горы.

Вот смотри на этот код, он просто не скомпилируется, и будет прав:

data class Empty()  // Ошибка: Data class must have at least one primary constructor parameter

Получается, data class без полей — это пиздопроебибна какая-то. Весь его смысл теряется. Ему нечего хэшировать, нечего в строку превращать, копировать нечего — один сплошной абсурд.

Так что же делать, если очень хочется? Да похуй, не надо data class! Возьми обычный class и не морочь никому голову. А если тебе нужен объект в единственном экземпляре — так объяви object, и все дела. Зачем городить манда с ушами из data class, если он пустой? Сам от себя охуеешь потом, когда через месяц будешь этот код читать.

Короче, вывод простой, как три копейки: data class — для данных. Нет данных — не позорься, используй что-то другое. Всё гениальное просто, а всё идиотское — не компилируется.