Kotlinin sinetöidyt luokat

Tässä artikkelissa opit Sealed-luokasta, kuinka ne luodaan ja milloin niitä tulisi käyttää esimerkkien avulla.

Suljettuja luokkia käytetään, kun arvolla voi olla vain yksi tyyppejä rajoitetusta joukosta (rajoitetut hierarkiat).

Ennen kuin ryhdymme yksityiskohtiin suljetuista luokista, tutkitaan, minkä ongelman he ratkaisevat. Otetaan esimerkki (otettu Kotlinin virallisilta verkkosivuilta - Suljetut luokat -artikkeli):

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

Yllä olevassa ohjelmassa perusluokalla Expr on kaksi johdettua luokkaa Const (edustaa lukua) ja Sum (edustaa kahden lausekkeen summaa). Tässä on pakollista käyttää elsehaaraa oletustilaksi kun lauseke.

Jos nyt luot uuden alaluokan Exprluokasta, kääntäjä ei havaitse mitään, kun elsehaara käsittelee sitä, mikä voi johtaa virheisiin. Olisi ollut parempi, jos kääntäjä antoi virheen, kun lisäsimme uuden alaluokan.

Voit ratkaista tämän ongelman käyttämällä suljettua luokkaa. Kuten mainittiin, suljettu luokka rajoittaa mahdollisuutta luoda alaluokkia. Ja kun käsittelet kaikkia suljetun luokan alaluokkia whenlausekkeessa, elsehaaraa ei tarvitse käyttää .

Suljetun luokan luomiseen käytetään suljettua muokkaajaa. Esimerkiksi,

 sinetöity luokka Laus

Esimerkki: Suljettu luokka

Näin voit ratkaista yllä olevan ongelman käyttämällä suljettua luokkaa:

 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 ) 

Kuten näette, elsehaaraa ei ole . Jos johdat uuden alaluokan Exprluokasta, kääntäjä valittaa, ellei aliluokkaa käsitellä whenlausekkeessa.

Muutama tärkeä huomautus

  • Kaikki suljetun luokan alaluokat on ilmoitettava samassa tiedostossa, jossa suljettu luokka ilmoitetaan.
  • Sinetöity luokka on itsessään abstrakti, etkä voi instantisoida siitä esineitä.
  • Et voi luoda suljetun luokan ei-yksityisiä rakentajia. niiden rakentajat ovat privateoletusarvoisesti.

Ero Enumin ja suljetun luokan välillä

Enum-luokka ja sinetöity luokka ovat melko samanlaisia. Myös laskentatyypin arvoja on rajoitettu kuten sinetöityä luokkaa.

Ainoa ero on, että enumilla voi olla vain yksi esiintymä, kun taas suljetun luokan alaluokalla voi olla useita esiintymiä.

Mielenkiintoisia artikkeleita...