English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriel de base Kotlin

Contrôle de flux Kotlin

Fonctions en Kotlin

Chaine de caractères en Kotlin

Kotlin orienté objet (OOP)

Classes scellées (Sealed) en Kotlin

Dans cet article, vous découvrirez les classes sécures (sécurisées) avec l'aide d'exemples, comment les créer et quand les utiliser.

Les classes sécurisées seront utilisées lorsque la valeur ne peut inclure qu'un type à partir d'un ensemble limité (une hiérarchie limitée).

Avant de détailler davantage les classes sécurisées, explorons les problèmes qu'elles résolvent. Laissons-nous un exemple :

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 ->
                lancer IllegalArgumentException("Unknown expression")
        }

Dans le programme ci-dessus, la classe de base Expr a deux sous-classes, Const (représentant un nombre) et Sum (représentant la somme de deux expressions). Ici, il faut utiliser la branche else pour traiter dans l'expression whende la condition par défaut.

Maintenant, si vous dérivez une nouvelle sous-classe de la classe Expr, le compilateur ne détectera rien car la branche else la traitera, ce qui peut entraîner des erreurs. Si le compilateur génère des erreurs lors de l'ajout d'une nouvelle sous-classe, c'est mieux.

Pour résoudre ce problème, vous pouvez utiliser des classes sécurisées. Comme mentionné précédemment, les classes sécurisées limitent la possibilité de créer des sous-classes. De plus, lorsque vous traitez toutes les sous-classes des classes sécurisées dans l'expression when, vous n'avez pas besoin de branche else.

Pour créer une classe sécurisée, utilisez l'opérateur de modificateur sécurisé sealed. Par exemple,

sealed class Expr

Exemple : exemple d'utilisation des classes sécures

Voici la méthode utilisant les classes sécures pour résoudre le problème mentionné ci-dessus :

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 le voyez, il n'y a pas de branche else. Si vous dérivez une nouvelle sous-classe de la classe Expr, à moins que cette sous-classe ne soit traitée dans l'expression when, le compilateur signalera.

Plusieurs points importants à noter

  • Toutes les sous-classes des classes scellées doivent être déclarées dans le même fichier que la déclaration de la classe scellée.

  • La classe scellée elle-même estAbstraitVous ne pouvez pas en instancier des objets.

  • Il n'est pas possible de créer de constructeurs non privés pour les classes scellées ; par défaut, leurs constructeurs sont private.

Différences entre énumérations et classes scellées

Classe d'énumérationTrès similaire aux classes scellées. L'ensemble de valeurs des types d'énumération est également limité comme celui des classes scellées.

La seule différence est que les énumérations ne peuvent avoir qu'un seul exemple, tandis que les sous-classes des classes scellées peuvent en avoir plusieurs.