Î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 else
ramura pentru condiția implicită în expresie atunci când.
Acum, dacă obțineți o nouă subclasă din Expr
clasă, compilatorul nu va detecta nimic pe măsură ce else
ramura 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 when
expresie, nu este necesar să utilizați else
ramură.
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ă else
ramură. Dacă obțineți o nouă subclasă din Expr
clasă, compilatorul se va plânge, cu excepția cazului în care subclasa este tratată în when
expresie.
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.