Sobes.tech
Middle

Qu'est-ce que les classes 'sealed' en Kotlin et dans quels cas doivent-elles être utilisées?

sobes.tech IA

Réponse de l'IA

La classe sealed est utilisée pour représenter une hiérarchie limitée de classes. Tous les sous-types directs d'une classe sealed doivent être définis dans le même fichier que la classe sealed ou dans les mêmes modules (pour Kotlin 1.5+). Cela permet au compilateur de vérifier que tous les sous-types possibles sont traités dans une expression when, la rendant exhaustive sans besoin de branche else.

Caractéristiques clés :

  • Tous les sous-classes directs doivent être locaux.
  • Le constructeur de la classe sealed est private par défaut.
  • La classe sealed ne peut pas être abstraite.
  • Elle ne permet pas de créer des instances.

Cas d'utilisation :

  • Représentation d'un ensemble limité d'états ou de résultats. Par exemple, Loading, Success(data), Error(message).
    sealed class Result<out T> {
       data class Success<T>(val data: T) : Result<T>()
       data class Error(val message: String) : Result<Nothing>()
       object Loading : Result<Nothing>()
    }
    
  • Traitement des variantes dans une expression when avec garantie d'exhaustivité.
    fun processResult(result: Result<String>) {
       when (result) {
          is Result.Success -> println("Données reçues : ${result.data}")
          is Result.Error -> println("Erreur : ${result.message}")
          Result.Loading -> println("Chargement...")
       }
       // Pas besoin de branche else, car le compilateur connaît tous les sous-types.
    }
    
  • Utilisation comme équivalent d'énumérations avec la capacité d'encapsuler des données dans chaque variante.

Comparaison avec les classes enum :

Caractéristique enum class sealed class
Instances Ensemble limité de constantes nommées Ensemble limité de types
Données dans les variantes Non (seules des propriétés) Oui (via des sous-classes)
Membres abstraits Non Oui
Héritage Non Oui, mais limité au même fichier/module