← Назад к вопросам

Что такое ключевое слово sealed?

2.0 Middle🔥 143 комментариев
#Kotlin основы#Архитектура и паттерны

Комментарии (3)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ключевое слово sealed в Kotlin

sealed — это модификатор класса в Kotlin, который создает ограниченную иерархию наследования, где все возможные подклассы должны быть объявлены в том же файле (с Kotlin 1.5 — в том же пакете или модуле). Это делает sealed классы мощным инструментом для моделирования закрытых (closed) типов данных, особенно полезных при работе с состояниями, результатами операций или дискриминированными объединениями (discriminated unions).

Основные характеристики

  1. Ограниченное наследование: Все подклассы sealed класса известны на этапе компиляции.
  2. Автоматическое наследование: Подклассы могут быть data class, object, или обычными классами.
  3. Использование с when: Компилятор может проверять исчерпываемость (exhaustiveness) выражений when, если они используются как выражение (возвращают значение).

Синтаксис и пример

sealed class Result<out T> {
    data class Success<T>(val data: T) : Result<T>()
    data class Error(val exception: Throwable) : Result<Nothing>()
    object Loading : Result<Nothing>()
}

Преимущества sealed классов

  • Безопасность типов: Компилятор знает все возможные варианты, что исключает ошибки времени выполнения.
  • Исчерпывающие проверки в when:
fun handleResult(result: Result<String>) = when (result) {
    is Result.Success -> println("Данные: ${result.data}")
    is Result.Error -> println("Ошибка: ${result.exception}")
    Result.Loading -> println("Загрузка...")
    // else не требуется — все случаи обработаны
}

Если добавить новый подкласс в sealed класс, компилятор укажет на необходимость обработки этого случая во всех when выражениях.

  • Четкое моделирование состояний: Идеально подходят для UI-состояний, результатов сетевых запросов, конечных автоматов.
sealed class ViewState {
    object Loading : ViewState()
    data class Content(val items: List<Item>) : ViewState()
    data class Error(val message: String) : ViewState()
}

Отличия от enum и open классов

  • vs enum: sealed классы позволяют хранить различные данные в каждом подклассе (как Success(data)), тогда как enum-константы — синглтоны без различных состояний.
  • vs open классов: open классы позволяют неограниченное наследование из любого места, что усложняет контроль за иерархией.

Эволюция в Kotlin

В Kotlin 1.5 снято ограничение на объявление подклассов в одном файле — теперь они могут быть в одном пакете или модуле. В Kotlin 1.7 появилась экспериментальная поддержка sealed interface, позволяющая создавать sealed-иерархии через интерфейсы.

Практическое применение

// Моделирование ответа API
sealed class ApiResponse {
    data class Success(val data: User) : ApiResponse()
    data class Failure(val error: ApiError) : ApiResponse()
    object NetworkError : ApiResponse()
}

// Обработка с гарантией покрытия всех случаев
fun process(response: ApiResponse) = when (response) {
    is ApiResponse.Success -> updateUI(response.data)
    is ApiResponse.Failure -> showError(response.error.message)
    ApiResponse.NetworkError -> showNetworkError()
}

Sealed классы — это краеугольный камень идиоматичного Kotlin, обеспечивающий типобезопасность, выразительность и удобство сопровождения кода при работе с ограниченными наборами вариантов. Их использование считается best practice для моделирования состояний в Android-приложениях, особенно в сочетании с ViewModel и StateFlow.