sealed class und interface in Kotlin — was es ist, Syntax und Anwendung

Autor: IT Sectr Veröffentlicht: 2026-06-20 Lesezeit: 11 Min.

sealed class und sealed interface in Kotlin sind Mechanismen für beschränkte Typhierarchien, bei denen alle möglichen Unterklassen zur Kompilierzeit bekannt sind. Im Gegensatz zu gewöhnlichen abstrakten Klassen garantiert sealed class eine erschöpfende Behandlung aller Varianten im when-Ausdruck. Laut der JetBrains Kotlin Language Guide-Dokumentation (2026) sind sealed-Typen die Grundlage für die Modellierung von Zuständen, UI-Bildschirmen und Ergebnistypen in Kotlin-Projekten.

Wichtige Punkte

  • sealed — beschränkte Hierarchie, bei der alle Unterklassen zur Kompilierzeit bekannt sind
  • when — erschöpfende Behandlung aller Unterklassen ohne obligatorischen else-Block
  • sealed interface — in Kotlin 1.5 für flexible Hierarchien ohne Vererbungseinschränkungen hinzugefügt
  • Kompilierung — Kompilierfehler bei unvollständigem when für sealed-Typen
  • Hierarchie — alle Unterklassen müssen in derselben Datei oder innerhalb der sealed-Klasse sein

Was sind sealed class und sealed interface?

sealed class ist eine abstrakte Klasse mit einer Einschränkung: Alle ihre direkten Unterklassen müssen in derselben Datei wie die sealed-Klasse selbst deklariert werden. Diese Einschränkung macht die Hierarchie geschlossen (sealed) — kein Code außerhalb der Datei kann eine neue Unterklasse hinzufügen.

sealed interface, hinzugefügt in Kotlin 1.5, bietet dieselbe Garantie, aber mit der Flexibilität eines Interfaces: Ein sealed interface kann von mehreren Klassen, Objekten oder anderen Interfaces in einer Datei implementiert werden. Im Gegensatz zu sealed class hat sealed interface keine Einfachvererbungsbeschränkung — eine Klasse kann mehrere sealed-Interfaces gleichzeitig implementieren.

Laut Kotlin Evolution and Roadmap (2026) wurde sealed interface auf Anfrage der Community für flexiblere Modellierung hinzugefügt. Die Hauptmotivation ist die Möglichkeit, unabhängige Typhierarchien ohne Mehrfachvererbung von Klassen zu kombinieren.

Syntax der sealed class

Die Deklaration einer sealed class beginnt mit dem Modifikator sealed vor class. Unterklassen werden in derselben Datei deklariert.

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

Jede Unterklasse einer sealed class kann eigene Eigenschaften und Methoden haben. Loading ist ein Singleton (object), Success und Error sind data classes mit Parametern. Der Compiler kennt alle drei Varianten und prüft ihre Vollständigkeit bei Verwendung in when.

Verschachtelte sealed-Klassen

Sealed-Klassen können verschachtelt werden, wodurch mehrstufige Hierarchien für komplexe Datenmodelle ohne Verlust der Typsicherheit entstehen.

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()
}

Syntax des sealed interface (Kotlin 1.5+)

sealed interface wird ähnlich wie sealed class deklariert, erlaubt jedoch die Implementierung mehrerer sealed-Interfaces in einer Klasse.

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

Die Klasse Navigate implementiert zwei sealed-Interfaces gleichzeitig — Action und Loggable. Dies ist mit sealed class aufgrund der Einfachvererbungsbeschränkung unmöglich. sealed interface bietet die Flexibilität, unabhängige Hierarchien zu kombinieren.

Wann sealed interface statt sealed class wählen

sealed interface ist vorzuziehen, wenn die Hierarchie keinen gemeinsamen Zustand oder Konstruktor erfordert. Laut den JetBrains Kotlin Guidelines (2026) sollte sealed interface standardmäßig für alle neuen Hierarchien verwendet werden, bei denen kein gemeinsamer Konstruktor benötigt wird, was den Code flexibler für zukünftige Erweiterungen macht.

Erschöpfende Behandlung in when

Der Hauptvorteil von sealed-Typen ist die erschöpfende (exhaustive) Behandlung im when-Ausdruck. Der Compiler prüft, ob alle möglichen Unterklassen abgedeckt sind.

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 ist nicht erforderlich — der Compiler weiß, dass alle Varianten abgedeckt sind
}

Wenn ein Entwickler eine neue Unterklasse zu einer sealed-Hierarchie hinzufügt, aber vergisst, sie in when zu behandeln, gibt der Compiler einen Fehler aus. Dies ist Sicherheit auf Typebene, die bei offenen Hierarchien mit else-Zweig nicht verfügbar ist.

Laut Google Android Developers (2026) sind sealed-Klassen die empfohlene Methode zur Modellierung des UI-Zustands in Jetpack Compose. Die erschöpfende when-Prüfung verhindert Zustände, bei denen der Entwickler nicht alle möglichen Anzeigevarianten eines Bildschirms behandelt hat.

Vergleich sealed class mit enum class

enum class und sealed class werden oft verwechselt, haben aber unterschiedliche Zwecke und Fähigkeiten.

Eigenschaftsealed classenum class
InstanzenMehrere (data class), eine (object)Genau eine pro Konstante
EigenschaftenUnterschiedlich für jede UnterklasseGleich für alle Konstanten
VererbungJa (von sealed class)Nein (implizit final)
KonstruktorKann Parameter habenNur gemeinsam für alle Konstanten
HierarchieBeschränkt, sealedFester Satz von Konstanten

Die Wahl zwischen sealed class und enum class hängt von der Aufgabe ab. Wenn Varianten keine zusätzlichen Daten tragen — verwenden Sie enum. Wenn jede Variante eindeutige Felder enthält — verwenden Sie sealed class oder sealed interface.

Praktische Anwendungsszenarien

Sealed-Typen werden in Kotlin-Projekten für eine Reihe von Standardszenarien verwendet, bei denen typsichere Modellierung erforderlich ist.

UI-Zustand in Jetpack Compose

Jeder Compose-Bildschirm kann eine sealed class UiState haben, die alle möglichen Zustände beschreibt: Idle, Loading, Content(data), Error(exception). Der when-Ausdruck garantiert, dass alle Zustände behandelt werden.

Ergebnisse von Netzwerkanfragen

NetworkResult mit den Varianten Success, Error, Loading ist ein Standardmuster in Kotlin-Projekten mit Retrofit und Ktor. sealed class gewährleistet eine sichere Behandlung jedes Anforderungsergebnisses.

Navigation in Multi-Modul-Projekten

sealed interface für Navigationsrouten ermöglicht es Modulen, ihre eigenen Routen zu deklarieren, während sie innerhalb einer einheitlichen Hierarchie bleiben. Dies eliminiert Fehler mit unbekannten Routen zur Kompilierzeit.

Laut KotlinConf (2025) sind sealed class und sealed interface die Grundlage für typsicheres Design in modernen Kotlin-Anwendungen. Sie werden mit data class kombiniert, um komplexe Domänenstrukturen zu modellieren, ohne die Sicherheit zur Kompilierzeit zu verlieren.

Häufig gestellte Fragen

Wo müssen Unterklassen einer sealed class deklariert werden?

Alle direkten Unterklassen einer sealed class müssen in derselben Datei deklariert werden. Für sealed interface gilt dieselbe Regel — Implementierungen in einer Datei.

Kann ein sealed interface Implementierungen in einer anderen Datei haben?

Nein, die Ein-Datei-Regel gilt auch für sealed interface. Alle Implementierungen müssen in der Datei sein, in der das sealed interface deklariert ist.

Was ist der Unterschied zwischen sealed class und sealed interface?

sealed interface hat keinen Zustand oder Konstruktor und ermöglicht Mehrfachimplementierung. sealed class kann einen Konstruktor und gemeinsamen Zustand haben, aber eine Klasse kann nur eine sealed class erben.

Wie helfen sealed-Klassen bei when-Ausdrücken?

Der Compiler prüft die Vollständigkeit von when: Wenn nicht alle Unterklassen behandelt werden, kompiliert der Code nicht. Dies eliminiert Laufzeitfehler und macht den Code sicherer.

Kann eine sealed class einen Konstruktor haben?

Ja, eine sealed class kann einen Konstruktor haben (standardmäßig private). Alle Unterklassen können Parameter an diesen Konstruktor über super() übergeben.

Zusammenfassung

  • sealed class — beschränkte Hierarchie mit zur Kompilierzeit bekannten Unterklassen
  • sealed interface — flexible Alternative (Kotlin 1.5+) mit Unterstützung für Mehrfachimplementierung
  • when — erschöpfende Behandlung mit Compiler-Prüfung, kein else erforderlich
  • Eine Datei — alle Unterklassen und Implementierungen müssen in derselben Datei wie der sealed-Typ sein
  • Modellierung — UI-Zustände, Netzwerkergebnisse, Navigation, Ereignissysteme
  • Sicherheit — Hinzufügen einer neuen Unterklasse ohne when-Behandlung verursacht Kompilierfehler
  • Wahl — sealed interface ist standardmäßig vorzuziehen, sealed class bei Bedarf an gemeinsamem Zustand

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch