ProgrammationDéveloppeur Kotlin, Développeur Backend, Développeur Android

Comment les interfaces scellées sont-elles mises en œuvre en Kotlin ? À quoi servent-elles, comment sont-elles utilisées et en quoi diffèrent-elles des classes scellées ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 :

  • Les interfaces scellées peuvent être implémentées uniquement dans le même fichier ;
  • Les interfaces scellées ne conservent pas d'état, mais leurs implémentations peuvent être des classes avec état ou des objets ;
  • Traitement exhaustif des expressions when à l'aide des interfaces scellées.

Questions pièges.

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.

Erreurs typiques et anti-modèles

  • Implémentation d'une interface scellée en dehors du fichier contenant sa déclaration (le compilateur ne le permettra pas).
  • Abus des interfaces scellées pour une rigueur accrue — cela peut entraîner une complexité architecturale excessive.
  • Tentative de création d'instances d'une interface scellée directement — impossible : seules les implémentations/objets concrets le peuvent.

Exemple de la vie réelle

Cas négatif

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 :

  • Architecture rapidement implémentable
  • Flexibilité d'implémentation

Inconvénients :

  • Expansion incontrôlée de la hiérarchie
  • Les expressions when ne sont pas contrôlées par le compilateur pour leur couverture complète

Cas positif

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 :

  • Contrôle total de l'arborescence
  • Support du traitement exhaustif des situations à l'étape de compilation

Inconvénients :

  • Toutes les implémentations doivent être dans un seul fichier, ce qui augmente la taille du fichier en cas de nombreuses options.