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