val lazyValue: String by lazy {
println("computed!")
"Hello" }
fun main(args: Array) {
println(lazyValue)
println(lazyValue)
}
Ushbu kod chiqadi:
computed!
Hello
Hello
Odatiy bo'lib, lazy xususiyatlarni hisoblash sinxronlashtiriladi : qiymat faqat bitta bajarilish satrida hisoblab chiqiladi va boshqa barcha oqimlar bir xil qiymatni ko'rishlari mumkin. Agar sinxronizatsiya zarur bo'lmasa, uni LazyThreadSafetyMode.PUBLICATIONfunktsiyaga parametr sifatida o'tkazing lazy(), shunda bir nechta iplar bir vaqtning o'zida hisoblashni amalga oshirishi mumkin. Yoki ishga tushirish har doim bir xil ijro etilishida sodir bo'lishiga amin bo'lsangiz, siz LazyThreadSafetyMode.NONEhar qanday ipning xavfsizligini kafolatlamaydigan rejimdan foydalanishingiz mumkin .
Kuzatiladigan xususiyatlar
Funktsiya Delegates.observable()ikkita argumentni oladi: xususiyatning boshlang'ich qiymati va xususiyat o'zgarganda chaqiriladigan ishlov beruvchi (lambda). Ishlovchining uchta parametri bor: o'zgartirilayotgan xususiyat tavsifi, eski qiymat va yangi qiymat.
import kotlin.properties.Delegates
class User {
var name: String by Delegates.observable("") {
prop, old, new ->
println("$old -> $new")
}
}
fun main(args: Array) {
val user = User()
user.name = "first" user.name = "second" }
Ushbu kod chiqadi:
-> first
first -> second
Agar siz ba'zi bir qiymatlarning berilishini oldini olishga qodir bo'lsangiz, vetoable()uning o'rniga funktsiyadan foydalaning observable().
Xususiyatlarni assotsiativ ro'yxatda saqlash
Vakiliy xususiyatlar uchun eng keng tarqalgan foydalanish holatlaridan biri bu xususiyatlarni assotsiativ ro'yxatda saqlashdir. Bu "dinamik" kodda, masalan, JSON bilan ishlashda foydalidir: