Назад к вопросам
Middle
220
questionbank

Что такое 'sealed' классы в Kotlin и в каких случаях их следует использовать?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

sealed класс используется для представления ограниченной иерархии классов. Все прямые наследники sealed класса должны быть определены в том же файле, что и сам sealed класс, или в тех же модулях (для Kotlin 1.5+). Это позволяет компилятору проверить, что все возможные подтипы обработаны в when выражении, делая его исчерпывающим без необходимости ветки else.

Ключевые особенности:

  • Все прямые подклассы должны находиться локально.
  • Конструктор sealed класса является private по умолчанию.
  • sealed класс не может быть абстрактным.
  • Не допускает создания экземпляров.

Случаи использования:

  • Представление ограниченного набора состояний или результатов. Например, Loading, Success(data), Error(message).
    sealed class Result<out T> {
       data class Success<T>(val data: T) : Result<T>()
       data class Error(val message: String) : Result<Nothing>()
       object Loading : Result<Nothing>()
    }
    
  • Обработка вариантов исходов в выражении when с гарантией исчерпывающей проверки.
    fun processResult(result: Result<String>) {
       when (result) {
          is Result.Success -> println("Data received: ${result.data}")
          is Result.Error -> println("Error: ${result.message}")
          Result.Loading -> println("Loading...")
       }
       // Нет необходимости в ветке else, так как компилятор знает все подтипы.
    }
    
  • Использование в качестве эквивалента перечислений с возможностью инкапсуляции данных в каждом варианте.

Сравнение с перечислениями (enum classes):

Характеристика enum class sealed class
Экземпляры Ограниченный набор именованных констант Ограниченный набор типов
Данные в вариантах Нет (только свойства) Да (через подклассы)
Абстрактные члены Нет Да
Наследование Нет Да, но ограничено в том же файле/модуле