sealed class и interface в Kotlin — что это, синтаксис и применение

Автор: IT Sectr Опубликовано: 2026-06-20 Время чтения: 11 мин

sealed class и sealed interface в Kotlin — это механизмы ограниченной иерархии типов, где все возможные подклассы известны на этапе компиляции. В отличие от обычных абстрактных классов, sealed class гарантирует исчерпывающую обработку всех вариантов в when-выражении. Согласно документации JetBrains Kotlin Language Guide (2026), sealed типы являются основой для моделирования состояний, UI-экранов и результатных типов в Kotlin-проектах.

Главное

  • sealed — ограниченная иерархия, где все подклассы известны на этапе компиляции
  • when — исчерпывающая обработка всех подклассов без обязательного else-блока
  • sealed interface — добавлен в Kotlin 1.5 для гибких иерархий без ограничений на наследование
  • Компиляция — ошибка компиляции при неполном when для sealed типов
  • Иерархия — все подклассы должны быть в одном файле или внутри sealed класса

Что такое sealed class и sealed interface?

sealed class — это абстрактный класс с ограничением: все его прямые подклассы должны быть объявлены в том же файле, что и сам sealed class. Это ограничение делает иерархию закрытой (sealed) — никакой код за пределами файла не может добавить новый подкласс.

sealed interface, добавленный в Kotlin 1.5, предоставляет ту же гарантию, но с гибкостью интерфейса: sealed interface может быть реализован несколькими классами, объектами или другими интерфейсами в одном файле. В отличие от sealed class, sealed interface не имеет ограничения на single inheritance — класс может реализовать несколько sealed интерфейсов одновременно.

По данным Kotlin Evolution and Roadmap (2026), sealed interface был добавлен по запросу сообщества для более гибкого моделирования. Основная мотивация — возможность комбинировать независимые иерархии типов без множественного наследования классов.

Синтаксис sealed class

Объявление sealed class начинается с модификатора sealed перед class. Подклассы объявляются в том же файле.

kotlin
sealed class NetworkResult {
    data class Success(val data: String) : NetworkResult()
    data class Error(val message: String) : NetworkResult()
    object Loading : NetworkResult()
}

Каждый подкласс sealed class может иметь собственные свойства и методы. Loading — это singleton (object), Success и Error — data class с параметрами. Компилятор знает все три варианта и проверяет их полноту при использовании in when.

Вложенные sealed class

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

kotlin
sealed class UiState {
    object Idle : UiState()
    object Loading : UiState()
    data class Content(val items: List<Item>) : UiState()
    data class Error(val exception: Throwable) : UiState()
}

Синтаксис sealed interface (Kotlin 1.5+)

sealed interface объявляется аналогично sealed class, но позволяет реализовывать несколько sealed интерфейсов в одном классе.

kotlin
sealed interface Action
sealed interface Loggable

data class Navigate(val route: String) : Action, Loggable
data class ShowToast(val text: String) : Action
object GoBack : Action, Loggable

Класс Navigate реализует сразу два sealed интерфейса — Action и Loggable. Для sealed class такое невозможно из-за ограничения single inheritance. sealed interface даёт гибкость комбинирования независимых иерархий.

Когда выбирать sealed interface вместо sealed class

sealed interface предпочтительнее, когда иерархия не требует общего состояния или конструктора. Согласно JetBrains Kotlin Guidelines (2026), sealed interface следует использовать по умолчанию для всех новых иерархий, где не нужен общий конструктор, что делает код более гибким для будущих расширений.

Исчерпывающая обработка в when

Главное преимущество sealed типов — исчерпывающая (exhaustive) обработка в when-выражении. Компилятор проверяет, что все возможные подклассы учтены.

kotlin
fun handleResult(result: NetworkResult): String = when (result) {
    is NetworkResult.Success -> "Data: ${result.data}"
    is NetworkResult.Error -> "Error: ${result.message}"
    is NetworkResult.Loading -> "Loading..."
    // else is not required — compiler knows all variants are covered
}

Если разработчик добавит новый подкласс в sealed иерархию, но забудет обработать его в when — компилятор выдаст ошибку. Это безопасность на уровне типов, недоступная при использовании открытых иерархий с else-веткой.

По данным Google Android Developers (2026), sealed классы — рекомендованный способ моделирования UI-состояния в Jetpack Compose. Исчерпывающая проверка when предотвращает состояния, когда разработчик обработал не все возможные варианты отображения экрана.

Сравнение sealed class с enum class

enum class и sealed class часто путают, но у них разные назначения и возможности.

Характеристикаsealed classenum class
ЭкземплярыНесколько (data class), один (object)Ровно один на константу
СвойстваРазные для каждого подклассаОдинаковые для всех констант
НаследованиеДа (от sealed class)Нет (implicit final)
КонструкторМожет иметь параметрыТолько общий для всех констант
ИерархияОграниченная, sealedФиксированный набор констант

Выбор между sealed class и enum class зависит от задачи. Если варианты не несут дополнительных данных — используйте enum. Если каждый вариант содержит уникальные поля — sealed class или sealed interface.

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

sealed типы используются в Kotlin-проектах для ряда стандартных сценариев, где требуется type-safe моделирование.

UI-состояние в Jetpack Compose

Каждый экран Compose может иметь sealed class UiState, который описывает все возможные состояния: Idle, Loading, Content(data), Error(exception). when выражение гарантирует, что все состояния обработаны.

Результат сетевых запросов

NetworkResult с вариантами Success, Error, Loading — стандартный паттерн в Kotlin-проектах с Retrofit и Ktor. sealed class обеспечивает безопасную обработку каждого исхода запроса.

Навигация в multi-module проектах

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

По данным KotlinConf (2025), sealed class и sealed interface — основа type-safe дизайна в современных Kotlin-приложениях. Они комбинируются с data class для моделирования сложных доменных структур без потери безопасности на этапе компиляции.

Часто задаваемые вопросы

Где должны быть объявлены подклассы sealed class?

Все прямые подклассы sealed class должны быть объявлены в том же файле. Для sealed interface то же правило — реализации в одном файле.

Может ли sealed interface иметь реализации в другом файле?

Нет, правило одного файла действует и для sealed interface. Все реализации должны находиться в файле, где объявлен sealed interface.

В чём разница между sealed class и sealed interface?

sealed interface не имеет состояния и конструктора, допускает множественную реализацию. sealed class может иметь конструктор и общее состояние, но класс может наследовать только один sealed class.

Как sealed классы помогают в when-выражениях?

Компилятор проверяет полноту when: если обработаны не все подклассы, код не компилируется. Это исключает ошибки runtime и делает код безопаснее.

Можно ли создать sealed class с конструктором?

Да, sealed class может иметь конструктор (по умолчанию private). Все подклассы могут передавать параметры в этот конструктор через super()

Итоги

  • sealed class — ограниченная иерархия с известными на этапе компиляции подклассами
  • sealed interface — гибкая альтернатива (Kotlin 1.5+) с поддержкой множественной реализации
  • when — исчерпывающая обработка с проверкой компилятора, else не требуется
  • Один файл — все подклассы и реализации должны находиться в одном файле с sealed типом
  • Моделирование — UI-состояния, сетевые результаты, навигация, event-системы
  • Безопасность — добавление нового подкласса без обработки в when вызывает ошибку компиляции
  • Выбор — sealed interface предпочтительнее по умолчанию, sealed class — при необходимости общего состояния

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также