Delegated property
- Kotlin kursu
- Orta seviye
- Ders 71/116
- 5 dk
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
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
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
val config ____ lazy { loadConfig() }
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.