Sellest artiklist saate näidete abil teada klassi Suletud kohta, kuidas need on loodud ja millal neid kasutada.
Suletud klassi kasutatakse juhul, kui väärtusel võib olla ainult üks piiratud kogumi tüüpidest (piiratud hierarhiad).
Enne suletud klasside üksikasjade uurimist uurime, millise probleemi nad lahendavad. Võtame näite (võetud Kotlini ametlikult veebisaidilt - suletud klasside artikkel):
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") )
Ülaltoodud programmis on baasklassil Expr kaks tuletatud klassi Const (tähistab arvu) ja Sum (tähistab kahe avaldise summat). Siin on else
avaldise olekus vaiketingimuseks kohustuslik kasutada haru.
Kui nüüd tuletate Expr
klassist uue alaklassi , ei tuvasta kompilaator midagi, kui else
haru sellega tegeleb, mis võib põhjustada vigu. Parem oleks olnud, kui uue alamklassi lisamisel koostas kompilaator vea.
Selle probleemi lahendamiseks võite kasutada suletud klassi. Nagu mainitud, piirab suletud klass alamklasside loomise võimalust. Ja kui käsitlete when
avaldises kõiki suletud klassi alamklasse, pole else
haru vaja kasutada .
Suletud klassi loomiseks kasutatakse suletud modifikaatorit. Näiteks,
pitseeritud klass Expr
Näide: suletud klass
Suletud klassi abil saate ülaltoodud probleemi lahendada järgmiselt:
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 )
Nagu näete, pole else
haru. Kui tuletate Expr
klassist uue alaklassi , kaebab kompilaator kaebuse, kui alamklass pole when
avaldises käsitletud .
Vähesed olulised märkused
- Kõik suletud klassi alamklassid tuleb deklareerida samas toimikus, kus deklareeritakse pitseeritud klass.
- Pitseeritud klass on iseenesest abstraktne ja te ei saa sellest objekte esile tõsta.
- Te ei saa luua suletud klassi mitte-erasektori ehitajaid; nende konstruktorid on
private
vaikimisi.
Erinevus Enumi ja suletud klassi vahel
Enumi klass ja kinnine klass on üsna sarnased. Ka loenditüübi väärtuste kogum on piiratud nagu suletud klass.
Ainus erinevus on see, et enumil võib olla ainult üks eksemplar, samas kui suletud klassi alamklassil võib olla mitu eksemplari.