Sealed Interface ist ein spezieller Typ von Interface in Kotlin, der die Anzahl der Implementierungen innerhalb eines Moduls einschränkt. Sealed Klassen wurden zuvor in Kotlin eingeführt, und sealed Interfaces wurden ab Kotlin 1.5 als Weiterentwicklung hinzugefügt, um mehr Kontrolle über die Typen zu haben, die zum Beispiel in Zustandshierarchien oder Ereignisverarbeitungen verwendet werden.
Früher verwendeten Entwickler sealed Klassen, um die Vererbung einzuschränken und sichere Hierarchien zu schaffen. Um jedoch Flexibilität zu gewährleisten und Strukturen zu unterstützen, in denen Vererbung von mehreren Typen nützlich ist, wurden sealed Interfaces benötigt.
Ohne sealed Interfaces kann man die Menge der Unterklassen eines Interfaces nicht flexibel verwalten. Dies macht eine umfassende when-Prüfung bei der Verarbeitung von Zuständen unmöglich, wenn alles auf Interfaces und nicht nur auf abstrakten/konkreten Klassen basiert.
Die Verwendung von sealed Interface ermöglicht:
when sicher ohne den else-Branch zu verwenden – der Compiler weist auf nicht abgedeckte Fälle hin.Beispielcode:
sealed interface Event class Click : Event class Scroll : Event fun handle(event: Event) = when(event) { is Click -> println("Click event") is Scroll -> println("Scroll event") }
Hauptmerkmale:
Können sealed Interfaces Implementierungen außerhalb der Datei ihrer Deklaration haben?
Nein, die Implementierungen des sealed Interfaces müssen sich im selben Modul befinden. Dies gewährleistet vollständige Erschöpfung und ermöglicht es dem Compiler, deren Anzahl zu kontrollieren.
Wie interagieren sealed Interfaces mit Klassen und Objekten?
Das sealed Interface kann sowohl von normalen Klassen als auch von Object-Klassen sowie von Datenobjekten (Kotlin 1.9+) implementiert werden. Ein solches Interface kann im Mehrfachvererbungssystem vorhanden sein, was mit sealed Klassen nicht möglich ist.
sealed interface Operation object Add: Operation object Subtract: Operation
Können sealed Interfaces geschachtelt werden?
Ja, man kann ein sealed Interface sowohl innerhalb einer anderen sealed Klasse als auch über anderen Interfaces deklarieren. Hauptsache sind alle Implementierungen innerhalb eines Moduls.
In der Anwendung wurden UI-Zustände einfach als Interfaces ohne sealed-Modifikator beschrieben. Eine Implementierung wurde vergessen, die statische Analyse hat dies nicht erkannt; der Fehler trat erst in der Produktion auf.
Vorteile:
Nachteile:
when.Verwendung von sealed Interface für das Modell der Bildschirmereignisse. Alle Implementierungen befinden sich in einer Datei des Moduls, der Compiler benachrichtigt bei nicht geschlossenen Ästen, wenn ein Fall in when übersehen wurde.
Vorteile:
Nachteile: