sealed class et interface en Kotlin — définition, syntaxe et application

Auteur : IT Sectr Publié le : 2026-06-20 Temps de lecture : 11 min

sealed class et sealed interface en Kotlin sont des mécanismes de hiérarchie de types restreinte, où toutes les sous-classes possibles sont connues à la compilation. Contrairement aux classes abstraites ordinaires, sealed class garantit un traitement exhaustif de toutes les variantes dans une expression when. Selon la documentation JetBrains Kotlin Language Guide (2026), les types sealed sont la base pour modéliser les états, les écrans d'interface utilisateur et les types de résultat dans les projets Kotlin.

Points clés

  • sealed — hiérarchie restreinte où toutes les sous-classes sont connues à la compilation
  • when — traitement exhaustif de toutes les sous-classes sans bloc else obligatoire
  • sealed interface — ajouté dans Kotlin 1.5 pour des hiérarchies flexibles sans restrictions d'héritage
  • Compilation — erreur de compilation pour un when incomplet sur les types sealed
  • Hiérarchie — toutes les sous-classes doivent être dans le même fichier ou à l'intérieur de la classe sealed

Qu'est-ce que sealed class et sealed interface ?

sealed class est une classe abstraite avec une restriction : toutes ses sous-classes directes doivent être déclarées dans le même fichier que la classe sealed elle-même. Cette restriction rend la hiérarchie fermée (sealed) — aucun code en dehors du fichier ne peut ajouter une nouvelle sous-classe.

sealed interface, ajoutée dans Kotlin 1.5, offre la même garantie mais avec la flexibilité d'une interface : une interface sealed peut être implémentée par plusieurs classes, objets ou autres interfaces dans un fichier. Contrairement à sealed class, l'interface sealed n'a pas de restriction d'héritage unique — une classe peut implémenter plusieurs interfaces sealed à la fois.

Selon Kotlin Evolution and Roadmap (2026), l'interface sealed a été ajoutée à la demande de la communauté pour une modélisation plus flexible. La motivation principale est la capacité de combiner des hiérarchies de types indépendantes sans héritage multiple de classes.

Syntaxe de sealed class

La déclaration d'une classe sealed commence par le modificateur sealed avant class. Les sous-classes sont déclarées dans le même fichier.

kotlin
sealed class NetworkResult {
    data class Success(val data: String) : NetworkResult()
    data class Error(val message: String) : NetworkResult()
    object Loading : NetworkResult()
}

Chaque sous-classe d'une classe sealed peut avoir ses propres propriétés et méthodes. Loading est un singleton (object), Success et Error sont des data classes avec paramètres. Le compilateur connaît les trois variantes et vérifie leur exhaustivité lorsqu'elles sont utilisées dans when.

Classes sealed imbriquées

Les classes sealed peuvent être imbriquées, créant des hiérarchies à plusieurs niveaux pour des modèles de données complexes sans perdre la sécurité de type.

kotlin
sealed class UiState {
    object Idle : UiState()
    object Loading : UiState()
    data class Content(val items: List<Item>) : UiState()
    data class Error(val exception: Throwable) : UiState()
}

Syntaxe de sealed interface (Kotlin 1.5+)

sealed interface se déclare de manière similaire à sealed class, mais permet d'implémenter plusieurs interfaces sealed dans une seule classe.

kotlin
sealed interface Action
sealed interface Loggable

data class Navigate(val route: String) : Action, Loggable
data class ShowToast(val text: String) : Action
object GoBack : Action, Loggable

La classe Navigate implémente deux interfaces sealed à la fois — Action et Loggable. C'est impossible avec sealed class en raison de la restriction d'héritage unique. L'interface sealed offre la flexibilité de combiner des hiérarchies indépendantes.

Quand choisir sealed interface plutôt que sealed class

sealed interface est préférable lorsque la hiérarchie ne nécessite pas d'état partagé ou de constructeur. Selon les JetBrains Kotlin Guidelines (2026), l'interface sealed doit être utilisée par défaut pour toutes les nouvelles hiérarchies où un constructeur commun n'est pas nécessaire, rendant le code plus flexible pour les extensions futures.

Traitement exhaustif dans when

Le principal avantage des types sealed est le traitement exhaustif dans l'expression when. Le compilateur vérifie que toutes les sous-classes possibles sont couvertes.

kotlin
fun handleResult(result: NetworkResult): String = when (result) {
    is NetworkResult.Success -> "Data: ${result.data}"
    is NetworkResult.Error -> "Error: ${result.message}"
    is NetworkResult.Loading -> "Loading..."
    // else n'est pas requis — le compilateur sait que toutes les variantes sont couvertes
}

Si un développeur ajoute une nouvelle sous-classe à une hiérarchie sealed mais oublie de la traiter dans when — le compilateur générera une erreur. C'est de la sécurité au niveau des types, indisponible avec les hiérarchies ouvertes utilisant une branche else.

Selon Google Android Developers (2026), les classes sealed sont la méthode recommandée pour modéliser l'état de l'UI dans Jetpack Compose. La vérification exhaustive de when empêche les états où le développeur n'a pas traité toutes les variantes possibles d'affichage d'un écran.

Comparaison sealed class avec enum class

enum class et sealed class sont souvent confondues, mais elles ont des objectifs et des capacités différents.

Caractéristiquesealed classenum class
InstancesPlusieurs (data class), une (object)Exactement une par constante
PropriétésDifférentes pour chaque sous-classeIdentiques pour toutes les constantes
HéritageOui (de sealed class)Non (final implicite)
ConstructeurPeut avoir des paramètresUniquement partagé pour toutes les constantes
HiérarchieRestreinte, sealedEnsemble fixe de constantes

Le choix entre sealed class et enum class dépend de la tâche. Si les variantes ne portent pas de données supplémentaires — utilisez enum. Si chaque variante contient des champs uniques — utilisez sealed class ou sealed interface.

Scénarios pratiques d'utilisation

Les types sealed sont utilisés dans les projets Kotlin pour une série de scénarios standard où une modélisation type-safe est nécessaire.

État de l'UI dans Jetpack Compose

Chaque écran Compose peut avoir une classe sealed UiState décrivant tous les états possibles : Idle, Loading, Content(data), Error(exception). L'expression when garantit que tous les états sont traités.

Résultats de requêtes réseau

NetworkResult avec les variantes Success, Error, Loading est un modèle standard dans les projets Kotlin avec Retrofit et Ktor. La classe sealed assure un traitement sûr de chaque résultat de requête.

Navigation dans les projets multi-modules

sealed interface pour les routes de navigation permet aux modules de déclarer leurs propres routes tout en restant dans une hiérarchie unifiée. Cela élimine les erreurs de routes inconnues à la compilation.

Selon KotlinConf (2025), sealed class et sealed interface sont la base de la conception type-safe dans les applications Kotlin modernes. Elles se combinent avec data class pour modéliser des structures de domaine complexes sans perdre la sécurité à la compilation.

Foire aux questions

Où les sous-classes de sealed class doivent-elles être déclarées ?

Toutes les sous-classes directes d'une classe sealed doivent être déclarées dans le même fichier. Pour l'interface sealed, la même règle s'applique — implémentations dans un fichier.

Une interface sealed peut-elle avoir des implémentations dans un autre fichier ?

Non, la règle du fichier unique s'applique également à l'interface sealed. Toutes les implémentations doivent être dans le fichier où l'interface sealed est déclarée.

Quelle est la différence entre sealed class et sealed interface ?

sealed interface n'a ni état ni constructeur et permet une implémentation multiple. sealed class peut avoir un constructeur et un état partagé, mais une classe ne peut hériter que d'une seule classe sealed.

Comment les classes sealed aident-elles dans les expressions when ?

Le compilateur vérifie l'exhaustivité de when : si toutes les sous-classes ne sont pas traitées, le code ne compile pas. Cela élimine les erreurs d'exécution et rend le code plus sûr.

Une classe sealed peut-elle avoir un constructeur ?

Oui, une sealed class peut avoir un constructeur (privé par défaut). Toutes les sous-classes peuvent passer des paramètres à ce constructeur via super().

Résumé

  • sealed class — hiérarchie restreinte avec sous-classes connues à la compilation
  • sealed interface — alternative flexible (Kotlin 1.5+) avec prise en charge d'implémentation multiple
  • when — traitement exhaustif avec vérification du compilateur, else non requis
  • Un fichier — toutes les sous-classes et implémentations doivent être dans le même fichier que le type sealed
  • Modélisation — états d'UI, résultats réseau, navigation, systèmes d'événements
  • Sécurité — l'ajout d'une nouvelle sous-classe sans traitement dans when provoque une erreur de compilation
  • Choix — interface sealed préférable par défaut, sealed class lorsque l'état partagé est nécessaire

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi