Kotlini pitseeritud klass

Joel Edenberg

Kotlini pitseeritud klass (sealed class) võimaldab täpselt kontrollida millised alamklassid tohivad sellest pärineda. Juba koodi kompileerimisel on teada kõik lubatud alamklassid, ning neid ei ole võimalik hiljem juurde luua. Mingis mõttes on nad sarnased konstantide loenditele (enum klassid). Erinevus on selles, et konstantide loendi elementidest saab eksisteerida ainult üks koopia, kuid pitseeritud klassi alamklassidest saab teha palju koopiaid (instance), mille sisemine olek saab erineda. Võimalus luua fikseeritud alamklasse, kuid erinevate sisesemiste olekutega, annab võimaluse salvestada sinna ka lisainfot, mida konstantide loend ei võimalda.

Hea kasutusnäide on mingisuguse staatuse hoidmine. Lisaks oleku tüüübile on mõistlik salvestada mõnedel juhtudel juurde ka spetsiifilist lisainfot:

sealed class Status {
    object GreatSuccess: Status()
    data class SadFailure(val reason: String): Status()
}


val result: HubStatus = Status.SadFailure("System error")
val message = when (result) {
    is Status.GreatSuccess -> "Answer"
    is Status.SadFailure -> "We failed: ${result.reason}"
}
println(message)

Miks seda peaks vaja olema?

Kui kompilaator teab juba ette, et millised alamklassid saavad eksisteerida, on võimalik automaatselt garanteerida, et kõik võimalikud loogikahargnemised on kontrollitud. Näiteks kasutades when blokki, ei ole vaja defineerida eraldi else tingimust. Juhul, kui keegi laiendab pitseeritud klassi, lisades sinna mõne uue lubatud alamklassi, tekkib kohe when bloki juures kompileerimise viga. Seega on väga kerge märgata, et uus potensiaalne kasutuslugu on koodis veel kontrollimata.

Rohkem lugemist
- https://kotlinlang.org/docs/sealed-classes.html