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'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.
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ı:
Eksileri:
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ı:
Eksileri: