custom delegate
- Kotlin kursu
- Orta seviye
- Ders 74/116
- 5 dk
Kendi property delegate'ini yazmayı öğrenirsin.
Özel delegate
Kendi delegate sınıfını yazabilirsin. Salt okunur bir özellik için operator fun getValue(thisRef: Any?, property: KProperty<*>): T tanımlanır. Örnek: class Single(val v: Int) { operator fun getValue(thisRef: Any?, property: KProperty<*>): Int = v }. Sonra val x by Single(42) ile kullanılır.
Oku-yaz özellik için operator fun setValue da eklenir. İstersen ReadOnlyProperty veya ReadWriteProperty arayüzlerini uygulayabilirsin ama operator fonksiyonları yazmak da yeterlidir. Bu, davranışı tamamen denetlemek için güçlü bir yoldur.
getValue operatörü
Bir delegate sınıfı operator fun getValue tanımladığında, by anahtar kelimesi ile bir özelliğe bağlanabilir. Örnek: class Single(val v: Int) { operator fun getValue(thisRef: Any?, property: KProperty<*>): Int = v }.
Kullanım: val x by Single(42). x her erişildiğinde getValue çağrılır ve 42 döner. thisRef özelliğin sahibi (null olabilir), property özellik referansıdır. Bu basit örnek sabit değer döner; daha karmaşık delegate'ler önbellek, günlük veya hesaplama yapabilir.
Uygulama Single delegate tanımla
import kotlin.reflect.KProperty ekle. class Single(val v: Int) tanımla; içinde operator fun getValue(thisRef: Any?, property: KProperty<*>): Int = v olsun. main içinde val x by Single(42) tanımla ve println(x) çağır.
Başlangıç kodu
import kotlin.reflect.KProperty
// Single sınıfını tanımla: getValue operatörü ile
fun main() {
// x'i Single(42) delegesi ile tanımla ve yazdır
}Örnek çözüm
import kotlin.reflect.KProperty
class Single(val v: Int) {
operator fun getValue(thisRef: Any?, property: KProperty<*>): Int = v
}
fun main() {
val x by Single(42)
println(x)
}Beklenen çıktı
42
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 custom delegate parçalarını eşle
| Kavram | Anlamı |
|---|---|
ReadOnlyProperty |
Salt okunur |
ReadWriteProperty |
Oku-yaz |
getValue |
Okuma |
setValue |
Yazma |
2 getValue gövdesini tamamla
class Single(val v: Int) {
operator fun getValue(thisRef: Any?, p: KProperty<*>): Int = ____
}
class Single(val v: Int) {
operator fun getValue(thisRef: Any?, p: KProperty<*>): Int = v
}
Açıklama: getValue v değerini döndürür.
3 Salt okunur özel delegate hangi operatörü gerektirir?
- getValue Doğru cevap
- setValue
- ikisi de
- yok
Açıklama: Salt okunur delegate yalnızca getValue gerektirir.