Hiljuti tekis koodiülevaatuse käigus diskusioon, et kuidas peaks andmeobjektis defineerima muutuja, mis arvutatakse teiste muutujate põhjal. See on oluline kahel põhjusel - kuidas seda muutujat saab hiljem mujal koodis kasutada ning kuidas see muutuja käitub algandmete muutumisel.
Kasutades funktiooni
data class Inimene(val eesnimi: String, val perekonnanimi) {
fun taisNimi(): String = "$eesnimi $perekonnanimi"
}
Muutuja loomiseks, mille väärtus arvutatakse jooksvalt, ei ole funktsiooni kasutamine hea lahendus, sest see ei ole Kotlini maailmas idiomaatiline lahendus.
Nimelt peaks siis mujal koodis viitama sellel kui objekt.taisNimi()
.
See aga näeb välja kui funktsiooni rakendamine, aga mitte andmeobjekti muutuja küsimine.
Sellist lahendust kasutatakse pigem Java maailmas.
Funktsiooni kasutamise hea külg on muidugi see, te juhul kui andmeobjekti algandmed oleksid muudetavad (tüüpi var
),
siis näeks ülejäänud kood alati õiget arvutuslikku täisnime väärtust.
Kasutades väärtuse ettearvutamist
data class Inimene(val eesnimi: String, val perekonnanimi) {
val taisNimi: String = "$eesnimi $perekonnanimi"
}
See on Kotlini idomaatiline lahendus.
Muutuja väärtust saab küsida objekt.taisnimi
, ning mujal koodis paistab see välja kui tavaline andmeväli.
Sellise variandi kõige suurem puudus on see, et lahendus eeldab mittemuutuvaid andmeid.
Kuna taisNimi
arvutatakse välja objekti loomise hetkel, siis hilisemad muudatused eesnimi
või prekonnanimi
andmeväljades ei kajastuks taisNimi
väärtuses.
Üldiselt võiksid andmed alati olla mittemuudetavad, aga probleeme võib tekkida ka näiteks järjenditega.
Isegi kui andmeklass sisaldab mitte muudetavat järjendit (val List<String>
), siis selle järjendi sisu on mutableListOf
korral ikkagi muudetav.
Mis omakorda tähendab, et objekti loomisel väärtustatud muutuja võib peale andmete uuendamist jääda sisaldama aegunud infot.
Kasutades arvutatud välja
val taisNimi: String
get() = "$eesnimi $perekonnanimi"
See on samuti Kotlini idomaatiline lahendus, kuna muutuja väärtust saab küsida objekt.taisnimi
, ning kasutajale paistab see kui tavaline andmeväli.
Kuid selle variandi eelis on see, et küsimisel arvutatakse alati andmevälja väärtus uuesti.
See tähendab, et kunagi ei tagastata aegunud infot.
Samuti on väikene pluss mälukasutus - selle muutuja väärtust ei hoita mälus.
Samas tuleb iga kord väärtus uuesti arvutada, ning olukordades, kui seda väärtust on vaja kasutada väga palju kordi, võib see tekitada protsessorile liigse ressursikulu.