In dit artikel leer je met behulp van voorbeelden over Sealed class, hoe ze zijn gemaakt en wanneer je ze kunt gebruiken.
Verzegelde klassen worden gebruikt wanneer een waarde slechts één van de typen uit een beperkte set kan hebben (beperkte hiërarchieën).
Laten we, voordat we ingaan op details over gesloten klassen, onderzoeken welk probleem ze oplossen. Laten we een voorbeeld nemen (afkomstig van de officiële Kotlin-website - Artikel over verzegelde 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") )
In het bovenstaande programma heeft de basisklasse Expr twee afgeleide klassen Const (vertegenwoordigt een getal) en Sum (vertegenwoordigt de som van twee uitdrukkingen). Hier is het verplicht om else
branch te gebruiken als standaardvoorwaarde in when-expressie.
Als je nu een nieuwe subklasse uit de Expr
klasse afleidt, zal de compiler niets detecteren omdat de else
branch het afhandelt, wat kan leiden tot bugs. Het zou beter zijn geweest als de compiler een foutmelding gaf toen we een nieuwe subklasse toevoegden.
Om dit probleem op te lossen, kunt u verzegelde klasse gebruiken. Zoals vermeld, beperkt verzegelde klasse de mogelijkheid om subklassen te maken. En als je alle subklassen van een verzegelde klasse in een when
expressie verwerkt , is het niet nodig else
branch te gebruiken .
Om een verzegelde klasse te maken, wordt verzegelde modifier gebruikt. Bijvoorbeeld,
verzegelde klasse Expr
Voorbeeld: verzegelde klasse
Hier leest u hoe u het bovenstaande probleem kunt oplossen met behulp van een verzegelde klasse:
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 )
Zoals u kunt zien, is er geen else
filiaal. Als je een nieuwe subklasse afleidt uit de Expr
klasse, zal de compiler klagen, tenzij de subklasse wordt afgehandeld in de when
uitdrukking.
Enkele belangrijke opmerkingen
- Alle subklassen van een verzegelde klasse moeten worden gedeclareerd in hetzelfde bestand waarin verzegelde klasse wordt gedeclareerd.
- Een verzegelde klasse is op zichzelf abstract en u kunt er geen objecten van instantiëren.
- U kunt geen niet-privé constructors van een verzegelde klasse maken; hun constructors zijn
private
standaard.
Verschil tussen Enum en Sealed Class
Enum-klasse en verzegelde klasse lijken redelijk op elkaar. De set waarden voor een enum-type is ook beperkt als een verzegelde klasse.
Het enige verschil is dat enum slechts één instantie kan hebben, terwijl een subklasse van een verzegelde klasse meerdere instanties kan hebben.