Kotlin versiegelte Klassen

In diesem Artikel erfahren Sie anhand von Beispielen, wie Sealed-Klassen erstellt werden und wann sie verwendet werden.

Versiegelte Klassen werden verwendet, wenn ein Wert nur einen der Typen aus einer begrenzten Menge (eingeschränkte Hierarchien) haben kann.

Bevor wir auf Details zu versiegelten Klassen eingehen, wollen wir untersuchen, welches Problem sie lösen. Nehmen wir ein Beispiel (entnommen aus der offiziellen Kotlin-Website - Artikel über versiegelte Klassen):

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

Im obigen Programm hat die Basisklasse Expr zwei abgeleitete Klassen Const (repräsentiert eine Zahl) und Sum (repräsentiert die Summe von zwei Ausdrücken). Hier ist es obligatorisch, elsebranch als Standardbedingung in when expression zu verwenden.

Wenn Sie jetzt eine neue Unterklasse von der ExprKlasse ableiten else, erkennt der Compiler nichts, da der Zweig damit umgeht, was zu Fehlern führen kann. Es wäre besser gewesen, wenn der Compiler beim Hinzufügen einer neuen Unterklasse einen Fehler ausgegeben hätte.

Um dieses Problem zu lösen, können Sie eine versiegelte Klasse verwenden. Wie bereits erwähnt, beschränkt die versiegelte Klasse die Möglichkeit, Unterklassen zu erstellen. Wenn Sie alle Unterklassen einer versiegelten Klasse in einem whenAusdruck behandeln, ist es nicht erforderlich, einen elseZweig zu verwenden .

Um eine versiegelte Klasse zu erstellen, wird ein versiegelter Modifikator verwendet. Beispielsweise,

 versiegelte Klasse

Beispiel: Versiegelte Klasse

So können Sie das obige Problem mit einer versiegelten Klasse lösen:

 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 ) 

Wie Sie sehen können, gibt es keinen elseZweig. Wenn Sie eine neue Unterklasse von der ExprKlasse ableiten , beschwert sich der Compiler, es sei denn, die Unterklasse wird im whenAusdruck behandelt.

Einige wichtige Hinweise

  • Alle Unterklassen einer versiegelten Klasse müssen in derselben Datei deklariert werden, in der die versiegelte Klasse deklariert ist.
  • Eine versiegelte Klasse ist für sich genommen abstrakt, und Sie können keine Objekte daraus instanziieren.
  • Sie können keine nicht privaten Konstruktoren einer versiegelten Klasse erstellen. Ihre Konstruktoren sind privatestandardmäßig.

Unterschied zwischen Enum und Sealed Class

Aufzählungsklasse und versiegelte Klasse sind ziemlich ähnlich. Der Wertesatz für einen Aufzählungstyp ist ebenfalls wie bei einer versiegelten Klasse eingeschränkt.

Der einzige Unterschied besteht darin, dass enum nur eine einzige Instanz haben kann, während eine Unterklasse einer versiegelten Klasse mehrere Instanzen haben kann.

Interessante Beiträge...