Kotlin - 12 - Delegasyon ve Delege Özellikler

Delegasyon:

Delegasyon implemantation için oldukça iyi bir alternatif, Kotlin bunu oldukça kolay ve az bir kod ile destekler.  Aşağıdaki örnekte “Base” interface ini miras alan ve tüm public method larını destekleyen “Derived” adında sınıf yaratılıyor.


“by b” ifadesi “b” nin “Derived” class’ı içinde obje olarak tutulacağını ifade ediyor ve derleyici “Base” in tüm method larını “b” için yaratacak. Yinede override etmek mümkün.


Delegate edilmiş özellikler:

Bazı durumlarda genel değişkenler olur ve sürekli manuel olarak eklememiz gerekiyor, her şey için bir kere eklemek iyi olabilir, bu doğrultuda ve aşağıdaki 3 fayda (Belkide fazlası) için Kotlin Delege özellikleri kullanır.
  • Lazy properties: değer sadece ilk erişimde hesaplanır.
  • Observable (gözlemlenebilir) properties: listener lar tarafından değer değişiklikleri yakalanır.
  • Her alan için ayrı özellik tutmak yerine map içinde tutmak.

Kotlin’de (1.1 sonrası) delege özellikler fonksiyon veya kod bloğu içinde olabilir, class member’ı olmak zorunda değil.



Standart Delege:

Lazy:
“Lazy()” lambda ifade alan ve ilk çağrımında ifadeyi çalıştırıp hatırlayan ve sonraki çağrımlarda bu sonucu dönen değişken yaratmak için kullanılabilir.


Observable özellikler:
Bu şekilde tanımlanan değişkenlerin değerinde oluşacak her değişiklik durumunda ilgili yordamlarımız çalışıyor olacak.


Özellikleri Map te tutmak:
Daha çok JSON parse işlemleri ya da diğer dinamik işlemlerde kullanılabilir. Böylece bir döngü içinde dinamik dataları key valuepair şeklinde işleyebilirsiniz. “val” yerine “var” değişkenler ile uğraşmak için “Map” ifadesi yerine “MutableMap” keyword’ü kullanılabilir.


Yerel değişkenlerin delege edilmesi: (1.1 versiyonu ile)
Local değişkenleri delege edilebilir, bu şekilde local değişikeni lazy olarak tanılayabilirsiniz.

Özellik delegasyonu için gerekenler:
“val” (read-only) özellikler için “getValue” method unu tanımlamalıdır. Ve parametreleri:

-          thisRef : tanımlanacak özellik, ile aynı yada bir üst tipi olmalı.
-          property :   KProperty<*> veya üst tipinde olmalı.

Return değeri de ilgili özellikle aynı tipte olmalıdır. “var” (mutable) özellikler için ayrıca “setValue” methodu olmalı ve aşağıdaki parametreleri içermeli:

-          thisRef : getValue ile Aynı.
-          Property : getValue ile Aynı.
-          new value : özellikle aynı yada üst tipi olmalı.

Bu method lar member olarak ya da extension fonksiyon olarak tanımlanabilir. Eğer bu method lara sahip olmayan bir tip için delegasyon yapılıyor ise bu method lar “operator” keyword’ü ile işaretlenmelidir. ReadOnlyProperty ve ReadWriteProperty interface leri ilgili “operator” olarak adlandırılmış olarak içerir. 

Çevirim kurallar:
Kotlinde delege edilen her özellik için arkada destekleyici bir özellik tanımlar ve adresleme yapar.



Örneğin, “prop” için arkada yaratılan “prop$delegate”tir ve bu değişkeni adresler. “prop” ile ilgili tüm bilgi oluşur, “this” dış sınıfa denk gelir, yani  ‘C’ sınıfına. “this::prop” (Bu syntax 1.1 ile kullanılabilir.) KProperty için oluşan yansıma objesidir.            


Yorumlar

Yazılar

Kotlin - 2 - Değişkenler