sealed class en sealed interface in Kotlin zijn mechanismen voor beperkte typehiërarchieën, waarbij alle mogelijke subklassen bekend zijn tijdens de compilatiefase. In tegenstelling tot gewone abstracte klassen garandeert sealed class een uitputtende verwerking van alle varianten in de when-expressie. Volgens de JetBrains Kotlin Language Guide (2026) vormen sealed types de basis voor het modelleren van toestanden, UI-schermen en resultaattypes in Kotlin-projecten.
Belangrijkste punten
sealed class is een abstracte klasse met een beperking: al zijn directe subklassen moeten in hetzelfde bestand als de sealed class worden gedeclareerd. Deze beperking maakt de hiërarchie gesloten (sealed) — geen code buiten het bestand kan een nieuwe subklasse toevoegen.
sealed interface, toegevoegd in Kotlin 1.5, biedt dezelfde garantie met de flexibiliteit van een interface: sealed interface kan worden geïmplementeerd door meerdere klassen, objecten of andere interfaces in één bestand. In tegenstelling tot sealed class heeft sealed interface geen beperking voor enkelvoudige overerving — een klasse kan meerdere sealed interfaces tegelijk implementeren.
Volgens Kotlin Evolution and Roadmap (2026) is sealed interface toegevoegd op verzoek van de community voor flexibelere modellering. De belangrijkste motivatie was de mogelijkheid om onafhankelijke typehiërarchieën te combineren zonder meervoudige klasse-overerving.
Declaratie van een sealed class begint met de modifier sealed voor class. Subklassen worden in hetzelfde bestand gedeclareerd.
sealed class NetworkResult {
data class Success(val data: String) : NetworkResult()
data class Error(val message: String) : NetworkResult()
object Loading : NetworkResult()
}
Elke subklasse van een sealed class kan eigen eigenschappen en methoden hebben. Loading is een singleton (object), Success en Error zijn data class met parameters. De compiler kent alle drie varianten en controleert hun volledigheid bij gebruik in when.
sealed klassen kunnen worden genest, waardoor meerlaagse hiërarchieën ontstaan voor complexe datamodellen zonder verlies van typeveiligheid.
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 wordt op dezelfde manier gedeclareerd als sealed class, maar staat implementatie van meerdere sealed interfaces in één klasse toe.
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
Klasse Navigate implementeert tegelijkertijd twee sealed interfaces — Action en Loggable. Voor sealed class is dit onmogelijk vanwege de beperking van enkelvoudige overerving. sealed interface biedt de flexibiliteit om onafhankelijke hiërarchieën te combineren.
sealed interface heeft de voorkeur wanneer de hiërarchie geen gedeelde toestand of constructor vereist. Volgens de JetBrains Kotlin Guidelines (2026) moet sealed interface standaard worden gebruikt voor alle nieuwe hiërarchieën waar geen gemeenschappelijke constructor nodig is, waardoor de code flexibeler wordt voor toekomstige uitbreidingen.
Het belangrijkste voordeel van sealed types is de uitputtende (exhaustive) verwerking in de when-expressie. De compiler controleert of alle mogelijke subklassen zijn meegenomen.
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 niet vereist — compiler weet dat alle varianten zijn gedekt
}
Als een ontwikkelaar een nieuwe subklasse aan de sealed hiërarchie toevoegt maar vergeet deze in when te verwerken — geeft de compiler een fout. Dit is veiligheid op typeniveau, die niet beschikbaar is bij gebruik van open hiërarchieën met een else-tak.
Volgens Google Android Developers (2026) zijn sealed klassen de aanbevolen manier om UI-toestand in Jetpack Compose te modelleren. De uitputtende when-controle voorkomt situaties waarin de ontwikkelaar niet alle mogelijke weergavevarianten van het scherm heeft verwerkt.
enum class en sealed class worden vaak verward, maar hebben verschillende doeleinden en mogelijkheden.
| Kenmerk | sealed class | enum class |
|---|---|---|
| Instanties | Meerdere (data class), één (object) | Precies één per constante |
| Eigenschappen | Verschillend voor elke subklasse | Hetzelfde voor alle constanten |
| Overerving | Ja (van sealed class) | Nee (implicit final) |
| Constructor | Kan parameters hebben | Alleen gemeenschappelijk voor alle constanten |
| Hiërarchie | Beperkt, sealed | Vaste set constanten |
Keuze tussen sealed class en enum class hangt af van de taak. Als varianten geen extra gegevens bevatten — gebruik enum. Als elke variant unieke velden bevat — gebruik sealed class of sealed interface.
sealed types worden in Kotlin-projecten gebruikt voor een reeks standaard scenario's die typeveilige modellering vereisen.
Elk Compose-scherm kan een sealed class UiState hebben die alle mogelijke toestanden beschrijft: Idle, Loading, Content(data), Error(exception). De when-expressie garandeert dat alle toestanden zijn verwerkt.
NetworkResult met varianten Success, Error, Loading — een standaard patroon in Kotlin-projecten met Retrofit en Ktor. sealed class zorgt voor veilige verwerking van elk verzoekresultaat.
sealed interface voor navigatieroutes stelt modules in staat hun eigen routes te declareren binnen één hiërarchie. Dit elimineert fouten met onbekende routes tijdens de compilatie.
Volgens KotlinConf (2025) vormen sealed class en sealed interface de basis van type-safe ontwerp in moderne Kotlin-applicaties. Ze worden gecombineerd met data class voor het modelleren van complexe domeinstructuren zonder verlies van veiligheid tijdens de compilatie.
Veelgestelde vragen
Alle directe subklassen van een sealed class moeten in hetzelfde bestand worden gedeclareerd. Voor sealed interface geldt dezelfde regel — implementaties in één bestand.
Nee, de regel van één bestand geldt ook voor sealed interface. Alle implementaties moeten in het bestand staan waar de sealed interface is gedeclareerd.
sealed interface heeft geen toestand en constructor, staat meervoudige implementatie toe. sealed class kan een constructor en gedeelde toestand hebben, maar een klasse kan slechts één sealed class overerven.
De compiler controleert de volledigheid van when: als niet alle subklassen zijn verwerkt, compileert de code niet. Dit elimineert runtime-fouten en maakt de code veiliger.
Ja, sealed class kan een constructor hebben (standaard private). Alle subklassen kunnen parameters aan deze constructor doorgeven via super().
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook