ProgrammatieAndroid/Kotlin-ontwikkelaar

Wat zijn sealed interfaces in Kotlin, hoe en waarom ze te gebruiken?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Sealed interface is een speciaal type interface in Kotlin dat het aantal implementaties binnen één module beperkt. Sealed classes verschenen eerst in Kotlin, en sealed interfaces werden toegevoegd vanaf Kotlin 1.5 als een evolutie voor meer controle over de types die betrokken zijn, bijvoorbeeld in status- of evenementhiërarchieën.

Geschiedenis van de vraag

Voorheen gebruikten ontwikkelaars sealed classes om erfelijkheid te beperken en veilige hiërarchieën te creëren. Echter, voor flexibiliteit en ter ondersteuning van structuren waar erfelijkheid van meerdere types nuttig is, waren sealed interfaces nodig.

Probleem

Zonder sealed interfaces kan men niet flexibel het aantal subklassen van de interface beheren. Dit maakt het bijvoorbeeld onmogelijk om een uitgebreide when-check te doen bij het verwerken van toestanden, als alles gebaseerd is op interfaces en niet alleen op abstracte/concrete klassen.

Oplossing

Het gebruik van sealed interface maakt het mogelijk:

  • Een vaste set implementaties te beschrijven.
  • Te garanderen dat alle implementaties bekend zijn bij de compiler.
  • Veilig when te gebruiken zonder else-tak — de compiler wijst op niet behandelde gevallen.

Voorbeeldcode:

sealed interface Event class Click : Event class Scroll : Event fun handle(event: Event) = when(event) { is Click -> println("Klik evenement") is Scroll -> println("Scroll evenement") }

Kernkenmerken:

  • Vernauwing en controle van de set van toegestane implementaties.
  • Mogelijkheid om van meerdere sealed interfaces tegelijk te erven.
  • Veiligheid bij patroonmatching (when).

Vragen met een valstrik.

Kunnen sealed interfaces implementaties hebben buiten het bestand van hun verklaring?

Nee, de implementaties van een sealed interface moeten zich in dezelfde module bevinden. Dit garandeert volledige uitputtendheid en stelt de compiler in staat om hun aantal te controleren.

Hoe interageren sealed interfaces met klassen en objecten?

Een sealed interface kan zowel door gewone als door objectklassen, evenals door data objecten (Kotlin 1.9+) worden geïmplementeerd. Zulke interfaces kunnen deelnemen aan meervoudige erfelijkheid, iets wat niet kan met sealed classes.

sealed interface Operation object Add: Operation object Subtract: Operation

Kunnen sealed interfaces genest zijn?

Ja, je kunt een sealed interface zowel binnen een andere sealed class als bovenop andere interfaces verklaren. Het belangrijkste is dat alle implementaties binnen één module blijven.

Typische fouten en anti-patronen

  • Het definiëren van implementaties van een sealed interface in verschillende modules leidt tot compilatiefouten.
  • Proberen een sealed interface te gebruiken op basis van de veronderstelling dat deze werkt zoals een sealed class, hoewel een sealed interface door andere interfaces geërfd kan worden.

Voorbeeld uit het leven

Negatieve case

In de applicatie werden UI-statussen simpelweg als interfaces zonder sealed-modificator beschreven. Een implementatie werd vergeten, de statische analyse kon dit niet opmerken; de fout kwam pas aan het licht in productie.

Voordelen:

  • Bekend patroon van Java-interfaces.

Nadelen:

  • Geen garanties voor uitputtendheid in when.
  • Kwetsbaarheid voor het verschijnen van implementaties "van buitenaf".

Positieve case

Het gebruik van sealed interface voor het model van schermgebeurtenissen. Alle implementaties bevinden zich binnen één bestand van de module, de compiler waarschuwt voor niet-afgedekte takken wanneer een case in when wordt gemist.

Voordelen:

  • Volledige type-veiligheid.
  • Gemak in onderhoud en uitbreiding.

Nadelen:

  • Alleen te gebruiken binnen één module.