Sobes.tech
Back to questions
Middle
320
questionbank

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

Sobes Copilot

Get answers in real time

Answer from AI

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
Экземпляры Ограниченный набор именованных констант Ограниченный набор типов
Данные в вариантах Нет (только свойства) Да (через подклассы)
Абстрактные члены Нет Да
Наследование Нет Да, но ограничено в том же файле/модуле