Что такое запечатанные классы и зачем они нам нужны?

Проблема

Для обработки состояний запроса API мы могли бы использовать классы перечисления. Enum в Java - это тип данных, содержащий фиксированный набор констант. Это особый тип данных, который позволяет переменной быть набором предопределенных констант. Его переменная должна быть равна одному из заранее определенных значений.

Здесь у нас нет других подробностей, связанных с ошибкой, он просто указывает, был ли запрос неудачным или успешным. Но если мы хотим узнать больше о состоянии отказа, будь то удаленный сбой, сбой сети и т. Д., У нас нет подходящего решения.

Решение

Итак, для такого рода проблем, чтобы обрабатывать состояния вместе с определенными типами, мы можем использовать запечатанные классы как хорошее решение. Запечатанный класс в Kotlin - это новая концепция, которую мы не найдем в Java. Проще говоря, для лучшей обработки состояния с ограниченными типами мы можем использовать запечатанные классы. Хотите узнать больше о классах enum, прочтите мой пост.

Что такое запечатанные классы?

Запечатанные классы используются для представления иерархий ограниченных классов, когда значение может иметь один из типов из ограниченного набора, но не может иметь другой тип.

Мы можем думать о запечатанном классе как о расширении классов перечисления. Но перечисления имеют ограничение, заключающееся в том, что каждая константа перечисления может иметь только один экземпляр, тогда как подкласс запечатанного класса может иметь несколько экземпляров, которые могут содержать состояние для лучшей обработки.

Объявление запечатанного класса - чтобы объявить класс запечатанным, нам нужно добавить ключевое слово sealed непосредственно перед ключевым словом класса.

sealed class Result

Зачем нужны запечатанные классы?

Как и абстрактные классы, запечатанные классы позволяют нам представлять иерархии. Дочерние классы могут быть классами любого типа, такими как класс данных, класс объекта, любой обычный класс или даже другой закрытый класс.

Но в отличие от абстрактных классов, нам нужно определить эти иерархии в том же файле или как вложенные классы. Мы не можем расширить запечатанный класс за пределы файла, который он определил, поскольку он дает ошибку компиляции.

С запечатанными классами мы можем иметь

  • Свобода представления абстрактных классов
  • Ограниченный набор типов перечислений.

Мы не можем наследовать от классов enum, но мы делаем это с помощью запечатанных классов.

Реализация

Давайте проверим, определив простой запечатанный класс, который имеет разные типы классов.

Теперь давайте посмотрим, как получить доступ к запечатанному классу, создав объекты и передав значения

Лучше использовать перечисления, когда у нас есть ограниченные типы для использования, а не состояния, связанные с каждым ограниченным типом, однако запечатанные классы должны использоваться, имея ограниченные типы и состояния, связанные с каждым ограниченным типом.

Запечатанные классы для лучшего управления государством

С помощью запечатанных классов мы можем упростить управление состоянием, относящимся к любому классу. При использовании запечатанных классов у нас есть предопределенные состояния для лучшего управления. Давайте подумаем о базовом примере обработки NetworkState с запечатанными классами с двумя состояниями: Loading и Failure.

Loading: это состояние вернет логическое значение. На основании этого значения мы решаем показать загрузку. Если true, мы показываем загрузку - в противном случае она скрыта.
Failure: Это состояние возвращает сообщение об ошибке и код ошибки на основе этих параметров, мы можем предпринять действие, например, показать всплывающее окно или повторить попытку, всплывающий экран и т. Д.

Теперь внутри нашей активности или фрагмента мы можем использовать выражение when для обработки всех состояний, указанных в NetworkState.

Правила запечатанного класса в Котлине

Поскольку классы Enum имеют свои ограничения, у запечатанных классов также есть некоторые предварительно определенные условия, которые необходимо соблюдать при их написании. Давайте рассмотрим набор правил:

  • Запечатанные типы не могут быть созданы. Мы не можем напрямую создать объект запечатанного класса и можем иметь абстрактные члены.
  • По умолчанию конструктор запечатанного класса является закрытым, и мы не можем сделать его не закрытым.
  • Подклассы запечатанного класса должны быть объявлены в том же файле, в котором объявлен запечатанный класс, однако косвенные наследники, такие как классы, расширяющие подклассы запечатанного класса, могут быть размещены где угодно.

Резюме

К настоящему времени у вас есть базовое представление об использовании запечатанных классов. Чтобы узнать больше о Котлине, ознакомьтесь с моими сообщениями

Вы можете найти меня в Medium и LinkedIn

Спасибо за прочтение…