Les interfaces scellées sont une fonctionnalité relativement nouvelle dans Kotlin (à partir de la version 1.5), conçue pour limiter l'ensemble des implémentations d'une interface dans un seul fichier. Au départ, Kotlin avait des classes scellées, qui offraient un contrôle strict sur l'héritage, facilitant un traitement exhaustif (par exemple, dans les expressions when).
Problème : Parfois, l'architecture nécessitait non pas une classe de base, mais une interface avec la même limitation quant au nombre d'implémentations. Avant l'avènement des interfaces scellées, la seule façon de se conformer aux restrictions du compilateur était d'utiliser une classe scellée, ce qui ne s'intégrait pas toujours bien dans le modèle du domaine, en particulier en cas d'héritage multiple ou de décomposition des comportements en interfaces.
Solution : Les interfaces scellées permettent de définir une interface, toutes les implémentations de laquelle doivent être déclarées dans un seul fichier. Cela augmente la sécurité du code et facilite le contrôle et la navigation dans l'arborescence des états ou des événements.
Exemple de code :
sealed interface NetworkState class Success(val data: String) : NetworkState class Error(val code: Int) : NetworkState object Loading : NetworkState
Caractéristiques clés :
Peut-on implémenter une interface scellée en dehors du fichier où elle est déclarée ?
Non. Comme pour les classes scellées, les interfaces scellées ne peuvent être implémentées que dans le même fichier que leur déclaration. En dehors de ce fichier, toute tentative d'implémentation de cette interface entraînera une erreur de compilation.
Une interface scellée peut-elle hériter d'une classe ?
Non, les interfaces ne peuvent hériter que d'autres interfaces. Cependant, une interface scellée peut hériter d'une autre interface (scellée).
Les interfaces scellées supportent-elles l'implémentation multiple ?
Oui, une classe dans ce même fichier peut implémenter plusieurs interfaces scellées ou même hériter d'une interface scellée et d'une classe scellée en même temps, si cela est conforme aux règles du langage.
Dans un système de traitement d'événements réseau, un développeur utilise des interfaces ordinaires et des classes scellées en mélange, ce qui entraîne une hiérarchie "sale" et un doublon de code. Les expressions when doivent contenir une branche else.
Avantages :
Inconvénients :
Dans cette même application, on passe à l'interface scellée NetworkEvent, en plaçant toutes les implémentations dans un seul fichier. Désormais, les expressions when sur NetworkEvent exigent le traitement de tous les cas. Le code devient plus lisible, maintenable et sûr.
Avantages :
Inconvénients :