ProgramlamaAndroid Geliştirici

Kotlin'de extension properties nedir, nasıl uygulanır, normal özelliklere göre hangi kısıtlamalar vardır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Extension properties, bir sınıfa durum (backing field) ekleme olanağı olmaksızın, getter ve setter eklemeye izin veren sınıf genişletmeleridir. Java'da böyle bir olanak yoktur ve benzer bir işlev, yardımcı yöntemlerin yazılmasıyla sağlanmaktadır. Tarihsel olarak, işlevsellik eklemek için statik yöntemler veya Wrapper nesneleri kullanmak zorunda kaldık.

Sorun: Üçüncü taraf sınıflarda sıkça gerekli özellikler eksik kalır. Sınıfı kısa ve güvenli bir şekilde, kapsüllemeyi ihlal etmeden genişletmek isteriz.

Çözüm: Kotlin'de, normal bir özellik gibi görünen ancak fonksiyonlar şeklinde gerçekleştirilmiş extension property tanımlanabilir. Bu, kaynak koduna erişemediğimiz türleri pratik bir şekilde genişletmeyi sağlar.

Kod örneği:

val String.firstChar: Char get() = this[0] println("Kotlin".firstChar) // K

Ana özellikler:

  • Extension property bir sentez şeklidir, durum (backing field) almaz.
  • Set özellikleri yalnızca fonksiyon aracılığıyla uygulanabilir.
  • Sadece sınıfın public API'si ile çalışır ve özel üyelere erişemez.

Aldatıcı Sorular.

Extension property'ye backing field (durum) eklemek mümkün mü?

Hayır, extension property sadece değeri anlık hesaplar ve durumu saklayamaz.

Extension properties, miras alınan sınıflardaki özellikleri geçersiz kılabilir mi?

Hayır, extension properties (ve uzantı fonksiyonları) esasen statiktir: geçersiz kılınamaz veya sanal olamaz.

Extension property nasıl derleniyor ve neden normal bir özelliğin sözdizimsel eşdeğeri değildir?

Extension property aslında bir statik getter (ve/veya setter) fonksiyonuna derlenir. Bunlar sınıf varlıklarına dahil edilmez ve yalnızca tanımlandıkları dosyada görünür.

Tipik Hatalar ve Anti-Desenler

  • Extension property içinde özel sınıf üyelerine erişim beklentisi
  • Extension property aracılığıyla durum saklama girişimi
  • Gereksiz olduğunda extension property kullanımı yerine normal property'leri kötüye kullanma

Gerçek Yaşam Örneği

Olumsuz Durum

Bir geliştirici, standart Android View'larında "ziyaret edilme" durumunu saklamak için bir extension property eklemeye çalıştı:

var View.isVisited: Boolean get() = ... set(value) { ... } // Hata: saklama yok

Artıları:

  • Söz dizimi kısadır

Eksileri:

  • Mümkün olmayan bir işlevsellik beklentisi (durumu saklamak mümkün değildir)
  • Çalışma zamanı hataları

Olumlu Durum

String için genişletilmiş format elde etmek üzere bir extension property gerçekleştirilmiştir:

val String.asTitle: String get() = this.replaceFirstChar { it.uppercase() }

Artıları:

  • İşlevselliğin eklenmesi kolaydır
  • Üçüncü taraf yardımcı araç yoktur
  • Kolay bakım

Eksileri:

  • Durum saklama yok (eğer gerekiyorsa, başka bir desen gerekir)