Data object — это новый тип объявлений в Kotlin (с версии 1.9), объединяющий свойства singleton-объекта и data class. Оно предназначено для случаев, когда хочется иметь только один экземпляр объекта и автоматически сгенерированные методы equals, hashCode, toString (как у data class).
Ранее для хранения уникальных сущностей с автогенерируемыми методом toString() и equals() приходилось писать object с ручными реализациями или компромиссно использовать data class с единственным объектом (а не экземплярами).
Singleton-объекты (object) не имеют автогенерируемых equals, hashCode, toString, а data class предполагает множество экземпляров, что не подходит для исчерпывающих enum-like моделей.
С появлением data object обе задачи решаются лаконично:
Пример кода:
data object LoadingState data object NoData println(LoadingState == LoadingState) // true println(LoadingState.toString()) // LoadingState
Ключевые особенности:
Чем отличается data object от обычного object?
Только data object получает автогенерацию методов equals, hashCode, toString на уровне компилятора; обычный object использует имплементации из Any (referential equality, небогатое toString).
Можно ли сделать data object с параметрами-конструктора?
Нет, у data object не может быть конструктора с параметрами. Он всегда без параметров, ведь существует только один экземпляр.
Можно ли наследовать data object?
Да, data object может реализовывать интерфейсы, включая sealed interface, и быть частью иерархий состояний.
Пример:
sealed interface Result data object Success : Result data object Failure : Result
Разработчик моделирует "нет данных" как object NoData, затем сравнивает по equals() со сторонним объектом и получает неожиданный результат (referential просмотр, а не содержательный).
Плюсы:
Минусы:
Используется data object для статусов загрузки, равенства и печать происходят по ожидаемым data class-правилам. Model слоя надёжно использует pattern matching по состояниям.
Плюсы:
Минусы: