sealed class и sealed interface у Kotlin-у су механизми ограничене хијерархије типова, где су сви могући подкласови познати у фази компајлације. За разлику од обичних апстрактних класа, sealed class гарантује исцрпну обраду свих варијанти у when изразу. Према документацији JetBrains Kotlin Language Guide (2026), sealed типови су основа за моделирање стања, UI екрана и резултатних типова у Kotlin пројектима.
Главно
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 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 класе могу бити угнежђене, стварајући вишеслојне хијерархије за сложене моделе података без губитка безбедности типова.
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 се декларише слично sealed class, али омогућава имплементацију више sealed интерфејса у једној класи.
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 је пожељнији када хијерархија не захтева заједничко стање или конструктор. Према JetBrains Kotlin Guidelines (2026), sealed interface треба користити подразумевано за све нове хијерархије где није потребан заједнички конструктор, чинећи код флексибилнијим за будућа проширења.
Главна предност sealed типова је исцрпна (exhaustive) обрада у when изразу. Компајлер проверава да ли су све могуће подкласе узете у обзир.
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 спречава ситуације када програмер није обрадио све могуће варијанте приказа екрана.
enum class и sealed class се често мешају, али имају различите намене и могућности.
| Карактеристика | sealed class | enum class |
|---|---|---|
| Инстанце | Више (data class), једна (object) | Тачно једна по константи |
| Својства | Различита за сваки подклас | Иста за све константе |
| Наслеђивање | Да (од sealed class) | Не (implicit final) |
| Конструктор | Може имати параметре | Само заједнички за све константе |
| Хијерархија | Ограничена, sealed | Фиксни скуп константи |
Избор између sealed class и enum class зависи од задатка. Ако варијанте не носе додатне податке — користите enum. Ако свака варијанта садржи јединствена поља — користите sealed class или sealed interface.
Sealed типови се користе у Kotlin пројектима за низ стандардних сценарија где је потребно моделирање са безбедношћу типова.
Сваки Compose екран може имати sealed class UiState који описује сва могућа стања: Idle, Loading, Content(data), Error(exception). when израз гарантује да су сва стања обрађена.
NetworkResult са варијантама Success, Error, Loading — стандардни образац у Kotlin пројектима са Retrofit и Ktor. sealed class обезбеђује безбедну обраду сваког исхода захтева.
sealed interface за руте навигације омогућава модулима да декларишу своје руте, остајући у оквиру јединствене хијерархије. Ово елиминише грешке са непознатим рутама у фази компајлације.
Према KotlinConf (2025), sealed class и sealed interface су основа type-safe дизајна у савременим Kotlin апликацијама. Комбинују се са data class за моделирање сложених доменских структура без губитка безбедности у фази компајлације.
Често постављана питања
Сви директни подкласови sealed class морају бити декларисани у истом фајлу. За sealed interface исто правило — имплементације у једном фајлу.
Не, правило једног фајла важи и за sealed interface. Све имплементације морају бити у фајлу где је декларисан sealed interface.
sealed interface нема стање и конструктор, дозвољава вишеструку имплементацију. sealed class може имати конструктор и заједничко стање, али класа може наследити само један sealed class.
Компајлер проверава потпуност when: ако нису обрађени сви подкласови, код се не компајлира. Ово елиминише runtime грешке и чини код безбеднијим.
Да, sealed class може имати конструктор (подразумевано private). Сви подкласови могу преносити параметре овом конструктору путем super().
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође