Думаю, многие уже подняли версию котлин и обнаружили там data object внутри sealed class (ещё год назад). Я сделала это совсем недавно, поэтому давайте сейчас разберемся, что это такое, зачем он нужен, и чем отличается от обычного object.
Что такое data object?
Напомню, что data class — это такие классы, которые автоматически генерируют equals(), hashCode() и toString(), чтобы они сразу зависели от состояния нашего котика (изменится возраст - изменятся результаты методов). А теперь представьте себе нечто подобное, но и для объектов.
data object — это новый модификатор, который позволяет создавать синглтоны (котиков, существующих в единственном экземпляре), автоматически генерируя для них полезные методы, аналогичные тем, что есть в data class.
Пример
Представим, что у нас есть объект CatPerson, который должен существовать в единственном экземпляре и хранить данные о том, сколько котиков человек погладил:
Этот объект автоматически получит методы equals(), hashCode(), и toString(). Это полезно, если мы хотим корректные логи или сравнение.
Для примера сделаем обычный object и data object и попробуем вывести логи:
И теперь если выведем toString, то будет напечатано:
DataCatLover
RegularCatLover@5b464ce8
Как видите, у обычного object будет напечатано RegularCatLover@5b464ce8, а у data object корректно всё выведется.
Методы, генерируемые для data object
- equals() — для сравнения котиков на равенство.
- hashCode() — для генерации хэш-кода котика.
- toString() — для строкового представления котика.
Эти методы аналогичны тем, что генерируются для data class. Заметьте, что тут нет copy (в object у нас всегда один котик и его не надо копировать) и компонентов (в object нет параметров).
А что с обычным object?
У обычного object также есть equals(), hashCode() и toString(), но они ведут себя иначе:
- equals(): для обычного object этот метод проверяет идентичность (т.е. сравниваются ссылки на котиков, а не их содержимое (уши, лапы, хвост)). Поскольку object — это синглтон, его экземпляр всегда идентичен сам себе.
- hashCode(): генерирует хэш-код на основе ссылки на объект. Раз object существует в одном экземпляре, его хэш-код постоянен.
- toString(): Возвращает строку, обычно состоящую из имени объекта и его хэш-кода в шестнадцатеричном виде, например, "CatLover@1a2b3c". А вот это уже критично для логов.
Дубль статей в телеграмме — https://t.me/android_junior
Мои заметки в телеграмме — https://t.me/android_junior_notes