I den här artikeln kommer du att lära dig mer om Sealed-klassen, hur de skapas och när du ska använda dem med hjälp av exempel.
Förseglade klasser används när ett värde endast kan ha en av typerna från en begränsad uppsättning (begränsade hierarkier).
Innan vi går in på detaljer om förseglade klasser, låt oss undersöka vilka problem de löser. Låt oss ta ett exempel (hämtad från den officiella Kotlin-webbplatsen - artikel om förseglade klasser):
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") )
I ovanstående program har basklassen Expr två härledda klasser Const (representerar ett tal) och Sum (representerar summan av två uttryck). Här är det obligatoriskt att använda else
gren för standardvillkor i när uttryck.
Nu, om du härleder en ny underklass från Expr
klassen, kommer kompilatorn inte att upptäcka något eftersom else
filialen hanterar den som kan leda till buggar. Det hade varit bättre om kompilatorn utfärdade ett fel när vi lade till en ny underklass.
För att lösa detta problem kan du använda förseglad klass. Som nämnts begränsar förseglad klass möjligheten att skapa underklasser. Och när du hanterar alla underklasser av en förseglad klass i ett when
uttryck är det inte nödvändigt att använda else
gren.
För att skapa en förseglad klass används förseglad modifierare. Till exempel,
förseglad klass Expr
Exempel: Förseglad klass
Så här kan du lösa ovanstående problem med förseglad klass:
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 )
Som du kan se finns det ingen else
gren. Om du härleder en ny underklass från Expr
klassen kommer kompilatorn att klaga om inte underklassen hanteras i when
uttrycket.
Få viktiga anmärkningar
- Alla underklasser av en förseglad klass måste deklareras i samma fil där förseglad klass deklareras.
- En förseglad klass är i sig själv abstrakt, och du kan inte instansiera objekt från den.
- Du kan inte skapa icke-privata konstruktörer av en förseglad klass; deras konstruktörer är som
private
standard.
Skillnaden mellan Enum och Sealed Class
Enum-klass och förseglad klass är ganska lika. Uppsättningen av värden för enumtyp är också begränsad som en förseglad klass.
Den enda skillnaden är att enum kan ha bara en enda instans, medan en underklass av en förseglad klass kan ha flera instanser.