ProgrammierungAndroid/Kotlin-Entwickler

Was sind sealed Interfaces in Kotlin, wie und wozu verwendet man sie?

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

Antwort.

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.

Hintergrund

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.

Problem

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.

Lösung

Die Verwendung von sealed Interface ermöglicht:

  • Eine feste Menge an Implementierungen zu beschreiben.
  • Sicherzustellen, dass alle Implementierungen dem Compiler bekannt sind.
  • 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:

  • Eingrenzung und Kontrolle der Menge der zulässigen Implementierungen.
  • Möglichkeit, von mehreren sealed Interfaces gleichzeitig zu erben.
  • Sicherheit bei Pattern Matching (when).

Trickfragen.

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.

Typische Fehler und Anti-Patterns

  • Die Definition von Implementierungen des sealed Interfaces in verschiedenen Modulen führt zu Kompilierungsfehlern.
  • Der Versuch, sealed Interfaces auf der Annahme zu verwenden, dass sie wie sealed Klassen sind, obwohl sealed Interfaces von anderen Interfaces vererbt werden können.

Beispiel aus dem Leben

Negativer Fall

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:

  • Vertrauter Pattern von Java-Interfaces.

Nachteile:

  • Keine Garantie für Erschöpfung in when.
  • Anfälligkeit für Implementierungen "von außen".

Positiver Fall

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:

  • Vollständige Typensicherheit.
  • Bequemlichkeit bei Wartung und Erweiterung.

Nachteile:

  • Verwendung nur innerhalb eines Moduls.