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

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

Как создать запечатанный класс в Kotlin?
Создайте новый класс и добавьте ключевое слово запечатанного перед классом, чтобы сделать его запечатанным классом.

sealed class Result

Теперь добавьте два подкласса непосредственно в один и тот же файл:

data class Success(val response : Response) : Result()
data class Failure(val exception : Exception) : Result()

Таким образом, файл Result.kt будет

sealed class Result {
   data class Success(val response : Response) : Result()
   data class Failure(val exception : Exception) : Result()
}

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

sealed class Result {
   data class Success(val response : Response) : Result()
   data class Failure(val exception : Exception) : Result()
   data class Loading(var loading : Boolean) : Result()
}

В отличие от enum-классов, где каждый случай является единственным экземпляром класса, у нас может быть несколько экземпляров подкласса закрытого класса.

 data class Success(val response : Response) : Result()

Теперь мы создадим два разных экземпляра Success. Например, мы можем передать responseA в качестве аргумента первому экземпляру и responseB второму экземпляру и сравнить их.

Kotlin позволяет нам использовать выражения when с нашими запечатанными классами. Когда мы используем их с запечатанным классом Result, мы можем анализировать результат в зависимости от того, был ли он успешным, неудачным или загрузочным.

when (result) {
 is Result.Success -> showData()
 is Result.Failure -> showError()
 is Result.Loading -> showLoader()
}

Мы не можем создавать прямые подклассы запечатанного класса за пределами файла, в котором он объявлен, а конструкторы запечатанных классов всегда закрыты. Это означает, что если у нас есть другой класс, определенный в другом файле нашего проекта, мы не можем расширить класс Result. Он предоставляет ограниченное количество иерархий, что делает его приватным. Следовательно, все подклассы запечатанного класса должны быть объявлены в том же пакете, что и сам запечатанный класс.

Заключение

В этой статье мы узнали о том, как Kotlin запечатывает классы и почему они могут быть лучшим выбором для управления состоянием.