Middle
Was sind 'sealed'-Klassen in Kotlin und in welchen Fällen sollten sie verwendet werden?
sobes.tech KI
Antwort von AI
Die sealed-Klasse wird verwendet, um eine begrenzte Hierarchie von Klassen darzustellen. Alle direkten Unterklassen einer sealed-Klasse müssen im selben Datei wie die sealed-Klasse selbst oder in denselben Modulen definiert sein (für Kotlin 1.5+). Dies ermöglicht dem Compiler zu überprüfen, dass alle möglichen Untertypen in einem when-Ausdruck behandelt werden, wodurch dieser vollständig wird, ohne dass eine else-Klausel erforderlich ist.
Wichtige Merkmale:
- Alle direkten Unterklassen müssen lokal sein.
- Der Konstruktor der
sealed-Klasse ist standardmäßigprivate. sealed-Klasse kann nicht abstrakt sein.- Es ist nicht erlaubt, Instanzen zu erstellen.
Anwendungsfälle:
- Darstellung eines begrenzten Satzes von Zuständen oder Ergebnissen. Zum Beispiel
Loading,Success(data),Error(message).sealed class Result<out T> { data class Success<T>(val data: T) : Result<T>() data class Error(val message: String) : Result<Nothing>() object Loading : Result<Nothing>() } - Behandlung von Varianten in einem
when-Ausdruck mit Garantie auf Vollständigkeit.fun processResult(result: Result<String>) { when (result) { is Result.Success -> println("Daten empfangen: ${result.data}") is Result.Error -> println("Fehler: ${result.message}") Result.Loading -> println("Lädt...") } // Es ist keine `else`-Klausel notwendig, da der Compiler alle Untertypen kennt. } - Verwendung als Äquivalent zu Aufzählungstypen mit der Möglichkeit, Daten in jeder Variante zu kapseln.
Vergleich mit enum class:
| Merkmal | enum class |
sealed class |
|---|---|---|
| Instanzen | Begrenzter Satz benannter Konstanten | Begrenzter Satz von Typen |
| Daten in Varianten | Nein (nur Eigenschaften) | Ja (über Unterklassen) |
| Abstrakte Mitglieder | Nein | Ja |
| Vererbung | Nein | Ja, aber auf den selben Datei/Modul beschränkt |