ProgrammierungKotlin Entwickler, Backend Entwickler, Android Entwickler

Wie sind sealed Interfaces in Kotlin implementiert? Wofür werden sie angewendet, wie werden sie verwendet und wie unterscheiden sie sich von sealed Klassen?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

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:

  • sealed Interfaces können nur innerhalb derselben Datei implementiert werden;
  • sealed Interfaces speichern keinen Zustand, aber ihre Implementierungen können Klassen mit Zustand oder Objekte sein;
  • erschöpfende Verarbeitung von when-Ausdrücken über sealed Interfaces.

Trickfragen.

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.

Typische Fehler und Anti-Patterns

  • Implementierung eines sealed Interfaces außerhalb der Datei mit seiner Deklaration (Compiler lässt dies nicht zu).
  • Missbrauch von sealed Interfaces zur Erhöhung der Striktheit – kann zu übermäßiger Komplexität der Architektur führen.
  • Versuch, Instanzen von sealed Interfaces direkt zu erstellen – nicht möglich: nur konkrete Implementierungen/Objekte.

Beispiel aus dem Leben

Negativer Fall

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:

  • Schnell implementierbare Architektur
  • Flexibilität der Implementierung

Nachteile:

  • Unkontrollierte Erweiterung der Hierarchie
  • when-Ausdrücke werden vom Compiler nicht auf Vollständigkeit geprüft

Positiver Fall

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:

  • Vollständige Kontrolle über die Hierarchie
  • Unterstützung der erschöpfenden Verarbeitung von Situationen zur Kompilierungszeit

Nachteile:

  • Alle Implementierungen müssen in einer Datei sein, was die Dateigröße bei einer großen Anzahl von Varianten erhöht.