CodeBlanks Logo Icon CodeBlanks

Delegated property

by lazy ve by observable ile delegasyon öğrenirsin.

Delegated property

Bir özelliğin get/set davranışını başka bir nesneye delege edebilirsin. by lazy bir özelliği ilk erişimde hesaplar ve önbelleğe alır. Örnek: val config by lazy { loadConfig() }. İlk erişimde loadConfig() çağrılır; sonraki erişimler önbellekten döner.

by Delegates.observable bir özelliğe atama yapıldığında bir lambda çalıştırır. Örnek: var count by Delegates.observable(0) { _, old, new -> println("$old -> $new") }. Her atamada eski ve yeni değer lambda'ya gelir. Bu, değişiklik izleme ve günlükleme için kullanışlıdır.

by lazy ve observable ayrıntıları

by lazy varsayılan olarak iş parçacığı güvenlidir (thread-safe); eşzamanlı ilk erişimlerde hesaplama yalnızca bir kez yapılır. LazyThreadSafetyMode ile bu davranış değiştirilebilir.

observable her atamada lambda'yı çağırır; atama her zaman gerçekleşir. Eğer atamayı bir koşula bağlı reddetmek istersen vetoable kullanılır; bunu bir sonraki derste göreceksin. observable günlükleme, sayaç ve önbellek temizleme gibi yan etkiler için uygundur.

Uygulama by lazy ve observable uygula

import kotlin.properties.Delegates ekle. val config by lazy { "Üretim" } tanımla. var counter by Delegates.observable(0) { _, old, new -> println("$old -> $new") } tanımla. main içinde println(config) çağır, sonra counter = 1 ve counter = 2 ata.

Başlangıç kodu

Main.kt
import kotlin.properties.Delegates

// config değişkenini lazy delegesi ile tanımla
// counter değişkenini observable delegesi ile tanımla

fun main() {
    // config'i yazdır, counter'ı iki kez değiştir
}

Örnek çözüm

Main.kt
import kotlin.properties.Delegates

val config by lazy { "Üretim" }
var counter by Delegates.observable(0) { _, old, new -> println("$old -> $new") }

fun main() {
    println(config)
    counter = 1
    counter = 2
}

Beklenen çıktı

Üretim
0 -> 1
1 -> 2

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 by lazy bildirimini tamamla

Soru
val config ____ lazy { loadConfig() }
Cevap
val config by lazy { loadConfig() }

Açıklama: by lazy ilk erişimde hesaplar.

2 delegated property eşle

Kavram Anlamı
by lazy Erken hesaplama
by observable Değişiklik izleme
lazy { } İlk erişimde
observable { } Her atamada

3 by lazy ne zaman hesaplanır?

  • Derleme zamanında
  • Sınıf yüklenince
  • İlk erişimde Doğru cevap
  • Asla

Açıklama: by lazy ilk erişimde hesaplar ve önbelleğe alır.

Orta seviye bölümündeki tüm dersler