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
sealedestprivatepar défaut. - La classe
sealedne 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
whenavec 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 |