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.
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.
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.
Het gebruik van sealed interface maakt het mogelijk:
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:
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.
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:
Nadelen:
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:
Nadelen: