Dans cet article, vous découvrirez les classes Sealed, comment elles sont créées et quand les utiliser à l'aide d'exemples.
Les classes scellées sont utilisées lorsqu'une valeur ne peut avoir qu'un seul des types d'un ensemble limité (hiérarchies restreintes).
Avant d'entrer dans les détails sur les classes scellées, explorons le problème qu'elles résolvent. Prenons un exemple (tiré du site officiel de Kotlin - article sur les classes scellées):
class Expr class Const(val value: Int) : Expr class Sum(val left: Expr, val right: Expr) : Expr fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) else -> throw IllegalArgumentException("Unknown expression") )
Dans le programme ci-dessus, la classe de base Expr a deux classes dérivées Const (représente un nombre) et Sum (représente la somme de deux expressions). Ici, il est obligatoire d'utiliser la else
branche comme condition par défaut dans l'expression when.
Maintenant, si vous dérivez une nouvelle sous-classe de la Expr
classe, le compilateur ne détectera rien car la else
branche la gère, ce qui peut conduire à des bogues. Il aurait été préférable que le compilateur émette une erreur lorsque nous avons ajouté une nouvelle sous-classe.
Pour résoudre ce problème, vous pouvez utiliser la classe scellée. Comme mentionné, la classe scellée limite la possibilité de créer des sous-classes. Et, lorsque vous gérez toutes les sous-classes d'une classe scellée dans une when
expression, il n'est pas nécessaire d'utiliser else
branch.
Pour créer une classe scellée, un modificateur scellé est utilisé. Par exemple,
classe scellée Expr
Exemple: classe scellée
Voici comment résoudre le problème ci-dessus en utilisant une classe scellée:
sealed class Expr class Const(val value: Int) : Expr() class Sum(val left: Expr, val right: Expr) : Expr() object NotANumber : Expr() fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) NotANumber -> java.lang.Double.NaN )
Comme vous pouvez le voir, il n'y a pas de else
succursale. Si vous dérivez une nouvelle sous-classe de Expr
class, le compilateur se plaindra à moins que la sous-classe ne soit gérée dans l' when
expression.
Quelques notes importantes
- Toutes les sous-classes d'une classe scellée doivent être déclarées dans le même fichier où la classe scellée est déclarée.
- Une classe scellée est abstraite en soi et vous ne pouvez pas instancier des objets à partir de celle-ci.
- Vous ne pouvez pas créer de constructeurs non privés d'une classe scellée; leurs constructeurs sont
private
par défaut.
Différence entre enum et classe scellée
La classe Enum et la classe scellée sont assez similaires. L'ensemble de valeurs pour un type enum est également restreint comme une classe scellée.
La seule différence est que, enum ne peut avoir qu'une seule instance, alors qu'une sous-classe d'une classe scellée peut avoir plusieurs instances.