Sealed Interfaces sind eine relativ neue Möglichkeit in Kotlin (ab Version 1.5), die dazu dient, die Anzahl der Implementierungen eines Interfaces innerhalb einer Datei zu beschränken. Ursprünglich gab es in Kotlin sealed Klassen, die eine strenge Kontrolle über die Vererbungshierarchie ermöglichten und die erschöpfende Verarbeitung erleichterten (z. B. in when-Ausdrücken).
Problem war, dass manchmal die Architektur kein Basisklasse, sondern ein Interface mit der gleichen Einschränkung bezüglich der Anzahl der Implementierungen erforderte. Vor der Einführung von sealed Interfaces war der einzige Weg, um in die Compiler-Einschränkungen zu passen, die Verwendung einer sealed Klasse, was nicht immer gut in das Modell des Domänenbereichs passte, insbesondere wenn Mehrfachvererbung oder Dekompensation des Verhaltens auf Interfaces erforderlich war.
Lösung: Sealed Interfaces ermöglichen es, ein Interface zu definieren, dessen alle Implementierungen innerhalb einer Datei deklariert sein müssen. Dies erhöht die Sicherheit des Codes und erleichtert die Kontrolle und Navigation durch die Hierarchie von Zuständen oder Ereignissen.
Beispielcode:
sealed interface NetworkState class Success(val data: String) : NetworkState class Error(val code: Int) : NetworkState object Loading : NetworkState
Wichtige Merkmale:
Kann ein sealed Interface außerhalb der Datei, in der es deklariert ist, implementiert werden?
Nein. Genau wie sealed Klassen können sealed Interfaces nur in derselben Datei implementiert werden, in der sie deklariert sind. Der Versuch, ein solches Interface außerhalb der Datei zu implementieren, führt zu einem Compilerfehler.
Kann ein sealed Interface von einer Klasse erben?
Nein, Interfaces können nur von anderen Interfaces erben. Aber ein sealed Interface kann von einem anderen (sealed) Interface erben.
Unterstützt sealed Interfaces Mehrfachimplementierung?
Ja, eine Klasse innerhalb derselben Datei kann mehrere sealed Interfaces implementieren oder sogar gleichzeitig ein sealed Interface und eine sealed Klasse erben, wenn dies nach den Regeln der Sprache zulässig ist.
In einem System zur Verarbeitung von Netzwerkereignissen verwendet der Entwickler normale Interfaces und sealed Klassen durcheinander, was zu einer "schmutzigen" Hierarchie und Code-Duplikation führt. when-Ausdrücke müssen einen else-Zweig enthalten.
Vorteile:
Nachteile:
In derselben Anwendung wechseln sie zu sealed Interface NetworkEvent und platzieren alle Implementierungen in einer Datei. Jetzt erfordert die Verarbeitung von when-Ausdrücken über NetworkEvent, dass alle Fälle abgedeckt werden. Der Code wird lesbarer, wartbarer und sicherer.
Vorteile:
Nachteile: