Найти тему

Data object внутри sealed class

Оглавление

Думаю, многие уже подняли версию котлин и обнаружили там data object внутри sealed class (ещё год назад). Я сделала это совсем недавно, поэтому давайте сейчас разберемся, что это такое, зачем он нужен, и чем отличается от обычного object.

Что такое data object?

Напомню, что data class — это такие классы, которые автоматически генерируют equals(), hashCode() и toString(), чтобы они сразу зависели от состояния нашего котика (изменится возраст - изменятся результаты методов). А теперь представьте себе нечто подобное, но и для объектов.

data object — это новый модификатор, который позволяет создавать синглтоны (котиков, существующих в единственном экземпляре), автоматически генерируя для них полезные методы, аналогичные тем, что есть в data class.

Пример

Представим, что у нас есть объект CatPerson, который должен существовать в единственном экземпляре и хранить данные о том, сколько котиков человек погладил:

Этот объект автоматически получит методы equals(), hashCode(), и toString(). Это полезно, если мы хотим корректные логи или сравнение.

Для примера сделаем обычный object и data object и попробуем вывести логи:

-2

И теперь если выведем toString, то будет напечатано:

DataCatLover
RegularCatLover@5b464ce8

Как видите, у обычного object будет напечатано RegularCatLover@5b464ce8, а у data object корректно всё выведется.

Методы, генерируемые для data object

  1. equals() — для сравнения котиков на равенство.
  2. hashCode() — для генерации хэш-кода котика.
  3. toString() — для строкового представления котика.

Эти методы аналогичны тем, что генерируются для data class. Заметьте, что тут нет copy (в object у нас всегда один котик и его не надо копировать) и компонентов (в object нет параметров).

А что с обычным object?

У обычного object также есть equals(), hashCode() и toString(), но они ведут себя иначе:

  1. equals(): для обычного object этот метод проверяет идентичность (т.е. сравниваются ссылки на котиков, а не их содержимое (уши, лапы, хвост)). Поскольку object — это синглтон, его экземпляр всегда идентичен сам себе.
  2. hashCode(): генерирует хэш-код на основе ссылки на объект. Раз object существует в одном экземпляре, его хэш-код постоянен.
  3. toString(): Возвращает строку, обычно состоящую из имени объекта и его хэш-кода в шестнадцатеричном виде, например, "CatLover@1a2b3c". А вот это уже критично для логов.
-3

Дубль статей в телеграмме — https://t.me/android_junior

Мои заметки в телеграмме — https://t.me/android_junior_notes