Kotlin dilinde bir sınıfta delegeğin çalışma prensibini açıklayabilir misin?
sobes.tech yapay zeka
AI'dan gelen yanıt
Kotlin'de delegat, belirli bir görevi üstlenen veya metod çağrılarını başka bir nesneye devreden bir nesnedir.
Kullanım senaryoları:
-
Özellik Delegasyonu: Bir özelliğin getter ve setter kontrolünü başka bir nesneye devretmek.
lazy: Özelliğin değeri ilk erişimde hesaplanır.observable: Özellik değeri değiştiğinde bir işlem gerçekleştirilir.vetoable: Bir koşula bağlı olarak özellik değerinin değişmesini engeller.
class Example { // Sadece ilk erişimde hesaplanır val lazyValue: String by lazy { println("Hesaplıyorum!") "Merhaba" } // Her değişimde çağrılır var name: String by Delegates.observable("<isim yok>") { prop, old, new -> println("İsim $old'den $new'ye değişti") } } -
Arayüz Delegasyonu: Bir arayüzü, metod çağrılarını başka bir nesneye yönlendirerek uygular.
interface Base { fun print() } class BaseImpl(val x: Int) : Base { override fun print() { println(x) } } // Base'yi uygular, BaseImpl'e çağrıları devreder class Derived(b: Base) : Base by b fun main() { val b = BaseImpl(10) Derived(b).print() // 10 yazdırır } -
Fonksiyon Delegasyonu: Belirli fonksiyonların devralması için açık sözdizimi olmasa da, bu kavramsal olarak başka bir nesnenin metodlarını çağırma ve bileşim yoluyla gerçekleştirilir.
Özellik delegasyonunun çalışma prensibi:
Kotlin derleyicisi yardımcı kod üretir. delegate nesnesine devredilen bir özellik için, derleyici gizli bir özellik oluşturur ve getValue ve setValue metodlarını (değiştirilebilir özellikler için) delegate nesnesinde çağırır, gerekli bağlamı (sınıf örneği, özellik meta verileri) ileterek.
// Örnek pseüdo kod, derleyicinin nasıl işlediği: val p: String by delegate
/*
private val _p: Delegate<Any?, String> = delegate_initializer
val p: String
get() = _p.getValue(this, ::p) // getValue çağrısı
*/
Delegatör nesne, uygun metodlara sahip olmalıdır:
getValue(thisRef, property: KProperty<*>): Tözellik tipiTolan bir özellik için.thisRefsınıf örneği,propertyözellik meta verileri.setValue(thisRef, property: KProperty<*>, value: T)değiştirilebilir özellikler için.
Delegasyonların avantajları:
- Kodun yeniden kullanımı: Ortak mantık (tembel başlatma, değişiklikleri izleme) ayrı bir delegatörde tutulur ve tekrar tekrar kullanılır.
- Okunabilirliğin artırılması: Kod daha az karmaşık hale gelir, boilerplate kod delegatör içinde gizlenir.
- Modülerlik: Özellik yönetimi veya arayüz uygulama mantığı, ana sınıf mantığından ayrılır.