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 за флексибилне хијерархије без ограничења наслеђивања
  • Компајлација — грешка компајлације при непотпунoм when за sealed типове
  • Хијерархија — сви подкласови морају бити у истом фајлу или унутар sealed класе

Шта су sealed class и sealed interface?

sealed class је апстрактна класа са ограничењима: сви њени директни подкласови морају бити декларисани у истом фајлу као и sealed class. Ово ограничење чини хијерархију затвореном (sealed) — ниједан код изван фајла не може додати нови подклас.

sealed interface, додат у Kotlin 1.5, пружа исту гаранцију, али са флексибилношћу интерфејса: sealed interface може бити имплементиран од стране више класа, објеката или других интерфејса у једном фајлу. За разлику од sealed class, sealed interface нема ограничење једноструког наслеђивања — класа може имплементирати више 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 са параметрима. Компајлер зна све три варијанте и проверава њихову потпуност при коришћењу у when.

Угнежђене sealed class

sealed класе могу бити угнежђене, стварајући вишеслојне хијерархије за сложене моделе података без губитка безбедности типова.

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 то је немогуће због ограничења једноструког наслеђивања. 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 није потребан — компајлер зна да су све варијанте покривене
}

Ако програмер дода нови подклас у 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 пројектима за низ стандардних сценарија где је потребно моделирање са безбедношћу типова.

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. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође