Kotlin förseglade klasser

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 elsegren för standardvillkor i när uttryck.

Nu, om du härleder en ny underklass från Exprklassen, kommer kompilatorn inte att upptäcka något eftersom elsefilialen 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 whenuttryck är det inte nödvändigt att använda elsegren.

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 elsegren. Om du härleder en ny underklass från Exprklassen kommer kompilatorn att klaga om inte underklassen hanteras i whenuttrycket.

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 privatestandard.

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.

Intressanta artiklar...