Clase sigilate Kotlin

În acest articol, veți afla despre clasa Sealed, cum sunt create și când să le folosiți cu ajutorul exemplelor.

Clasele sigilate sunt folosite atunci când o valoare poate avea doar unul dintre tipurile dintr-un set limitat (ierarhii restricționate).

Înainte de a intra în detalii despre clasele sigilate, să explorăm ce problemă rezolvă. Să luăm un exemplu (preluat de pe site-ul oficial al Kotlin - Articolul claselor sigilate):

 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") )

În programul de mai sus, clasa de bază Expr are două clase derivate Const (reprezintă un număr) și Sum (reprezintă suma a două expresii). Aici, este obligatoriu să utilizați elseramura pentru condiția implicită în expresie atunci când.

Acum, dacă obțineți o nouă subclasă din Exprclasă, compilatorul nu va detecta nimic pe măsură ce elseramura o gestionează, ceea ce poate duce la erori. Ar fi fost mai bine dacă compilatorul a emis o eroare atunci când am adăugat o nouă subclasă.

Pentru a rezolva această problemă, puteți utiliza clasa sigilată. După cum sa menționat, clasa sigilată restricționează posibilitatea de a crea subclase. Și, atunci când gestionați toate subclasele unei clase sigilate într-o whenexpresie, nu este necesar să utilizați elseramură.

Pentru a crea o clasă sigilată, se folosește modificatorul sigilat. De exemplu,

 clasa sigilata Expr

Exemplu: Clasa sigilată

Iată cum puteți rezolva problema de mai sus folosind clasa sigilată:

 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 ) 

După cum puteți vedea, nu există elseramură. Dacă obțineți o nouă subclasă din Exprclasă, compilatorul se va plânge, cu excepția cazului în care subclasa este tratată în whenexpresie.

Puține note importante

  • Toate subclasele unei clase sigilate trebuie declarate în același dosar în care este declarată clasa sigilată.
  • O clasă sigilată este abstractă prin ea însăși și nu puteți instanția obiecte din ea.
  • Nu puteți crea constructori non-privați ai unei clase sigilate; constructorii lor sunt privateîn mod implicit.

Diferența dintre Enum și clasa sigilată

Clasa Enum și clasa sigilată sunt destul de asemănătoare. Setul de valori pentru un tip enum este, de asemenea, restricționat ca o clasă sigilată.

Singura diferență este că, enum poate avea o singură instanță, în timp ce o subclasă a unei clase sigilate poate avea instanțe multiple.

Articole interesante...