Kotlin'de Extension property — nedir, sözdizimi ve kullanım

Yazar: IT Sectr Yayınlanma: 2026-06-21 Okuma süresi: 8 dk

extension property — kalıtım olmadan ve kaynak kodu değiştirmeden mevcut sınıflara yeni özellikler eklemeye izin veren bir Kotlin mekanizmasıdır. extension functions'ın aksine, extension properties durum depolayamaz — yalnızca bir getter ve isteğe bağlı olarak bir setter ile bildirilirler, çünkü backing field'leri yoktur. Kotlin Documentation, 2025'e göre, extension properties receiver'ı ilk parametre olarak alan statik getter ve setter metodlarına derlenir.

Ana Noktalar

  • Extension property — bir receiver type ile özellik, Kotlin özellik sözdizimi ile erişilebilir
  • Backing field yok — extension property durum depolayamaz, sadece hesaplayabilir
  • Getter zorunlu, setter isteğe bağlı — normal extension functions gibi bildirilir
  • Nullable tipler desteklenir: receiver dahili kontrollerle nullable olabilir
  • Değiştirilebilir extension property — yalnızca getter ve setter ile var olarak bildirildiğinde

Kotlin'de extension property nedir?

Extension property, bildirimini değiştirmeden mevcut bir türe özellik ekleyen Kotlin'de sözdizimsel bir yapıdır. Özellik bir receiver type ile bildirilir ve bir getter içermelidir. Normal özelliklerden temel fark, backing field'ın olmamasıdır: extension property veri depolayamaz, yalnızca receiver nesnesine dayanarak hesaplama yapabilir.

Kotlin Foundation Anketi (2024)'e göre, extension properties extension functions'tan daha az popülerdir — geliştiricilerin yaklaşık %45'i bunları düzenli olarak kullanır. Bunun nedeni, durum olmaması sınırlamasıdır ve uygulama kapsamını daraltır. Yine de, bir türe mantıksal olarak bağlı hesaplanmış özellikler için extension properties en kısa seçenektir.

Extension properties bir çift statik getter ve setter metoduna derlenir. Bayt kodu seviyesinde, bir extension property çağırmak ile bir extension function çağırmak arasında fark yoktur — her ikisi de receiver parametresi olan statik metotlar haline gelir. JetBrains'e (Kotlin Docs, 2025) göre, hiçbir ek yük yoktur.

Metot çağrılarından ziyade özellik gibi görünmesi gereken kısa hesaplanmış değerler için extension properties kullanın — bu kod okunabilirliğini artırır ve Tekdüzen Erişim İlkesi'ne uyar.

Extension property sözdizimi: val ve var

Bir extension property bildirmek için, normal bir özelliğe benzer sözdizimi kullanın, ancak receiver type ön ekiyle. val zorunlu getter ile salt okunur bir extension property bildirir, var getter ve isteğe bağlı setter ile değiştirilebilir bir tane bildirir.

kotlin
// Salt okunur extension property
val String.isEmail: Boolean
    get() = this.contains("@") && this.contains(".")

// Çağrı
val valid = "test@test.com".isEmail

Not: bir extension property parantez olmadan çağrılır — str.isEmail, str.isEmail() değil. Bu, extension property ve extension function arasındaki temel farktır: bir özellik, aslında bir getter aracılığıyla hesaplanmasına rağmen, bir alan gibi görünür.

Generic extension property

Extension properties generic olabilir — receiver generic tip parametreleri kullanabilir. Bu, herhangi bir koleksiyon türüyle çalışan evrensel özellikler oluşturmaya izin verir.

kotlin
val List<T>.secondOrNull: T?
    get() = if (size >= 2) this[1] else null

val items = listOf("a", "b", "c")
val second = items.secondOrNull // "b"

secondOrNull özelliği herhangi bir T türü için çalışır, listenin ikinci öğesini veya ikiden az öğe varsa null döndürür. Bu, extension property'nin bir fonksiyondan daha uygun olduğu tipik bir örnektir — erişimi bir alan okumak gibi görünür.

Extension property neden durum depolayamaz

Bir extension property, sınıf metaverisine eklenmediği için backing field'a sahip olamaz — yalnızca bir çift statik getter/setter fonksiyonu olarak var olur. Backing field (Kotlin'de field anahtar kelimesi), özellik değerini depolayan sınıfın iç alanıdır. Extension property'nin sınıfın iç yapısına erişimi yoktur.

kotlin
// ❌ HATA: extension property bir backing field'a sahip olamaz
var String.cachedValue: String
    get() = "computed"
    set(value) {
        field = value // alana erişilemiyor!
    }

// ✅ DOĞRU: harici depolama kullanın
val cache = MutableMap<String, String>()

var String.cachedValue: String
    get() = cache[this] ?: ""
    set(value) { cache[this] = value }

Örnekteki harici bir Map depolama sorununu çözer ancak başka bir sorun yaratır — bellek sızıntısı. Extension property aracılığıyla elde edilen değerler, temizlenmezse Map'te sonsuza kadar yaşar. Bu sınırlama, extension properties'i önbelleğe alma veya geçici veri depolama için uygunsuz hale getirir.

Önbelleğe alma için, WeakHashMap veya otomatik temizleme mekanizmalarının kullanılması önerilir. JetBrains, dikkatli bir yaşam döngüsü yönetimi olmadan üretim kodunda harici depolama ile var extension properties kullanmaktan kaçınılmasını önerir.

Extension property vs extension function: ne zaman ne seçilir

Extension property ve extension function arasındaki seçim anlambilime bağlıdır: bir özellik bir nesnenin karakteristiğini tanımlarken, bir fonksiyon bir eylemi tanımlar. Tekdüzen Erişim İlkesi şunu belirtir: istemci, bir değerin hesaplanıp hesaplanmadığını veya depolanıp depolanmadığını bilmemelidir. Değer bir karakteristik (uzunluk, boyut, durum) olarak temsil edilebiliyorsa — bir özellik kullanın.

KriterExtension propertyExtension function
ÇağrıParantezsiz: obj.propertyParantezli: obj.function()
AnlambilimKarakteristik, nitelikEylem, işlem
Backing fieldDesteklenmezUygulanamaz
ParametrelerSadece getter/setterHerhangi bir parametre
PerformansAynı (statik metot)Aynı (statik metot)
Örnektext.lengthtext.isEmail()

Kural basittir: işlem parametre alıyorsa — extension function kullanın. Parametresiz basit bir hesaplanmış değerse — extension property kullanın. Android Architecture Guide'a (Google, 2025) göre, veri erişimi için extension properties ve yan etkileri olan işlemler için extension functions tercih edilmelidir.

var ve setter ile değiştirilebilir extension property

var anahtar kelimesiyle extension property bir setter'ı destekler, ancak bir değer depolama yeteneği olmadan — setter genellikle bir yan etki gerçekleştirir veya harici bir depolamaya veri kaydeder. Sözdizimi değiştirilebilir sınıf özelliklerine benzer.

kotlin
// Setter ile değiştirilebilir extension property
var StringBuilder.lastChar: Char
    get() = this[length - 1]
    set(value) {
        this.setCharAt(length - 1, value)
    }

val sb = StringBuilder("Kotlin")
println(sb.lastChar) // n
sb.lastChar = '!'
println(sb) // Kotli!

lastChar özelliği Kotlin dokümantasyonundan klasik bir örnektir. Getter, StringBuilder'ın son karakterini döndürür, setter onu yeni bir değerle değiştirir. Not: durum ayrı bir alanda değil, StringBuilder'ın kendisinde (setCharAt aracılığıyla) depolanır — bu bir extension property'nin doğru kullanımıdır.

Extension properties için pratik örnekler

Gerçek projelerde, extension properties en çok koleksiyon verilerine erişimi basitleştirmek, UI öğelerinin boyutlarını veya durumlarını hesaplamak ve mevcut sınıflar üzerinde kullanışlı bir API oluşturmak için kullanılır. Kotlin standart kütüphanesi bu mekanizmayı aktif olarak kullanır: koleksiyonlar için size, indices, lastIndex — bunlar extension properties'dir.

kotlin
// Koleksiyonlar için extension properties
val List<Int>.sumFast: Int
    get() = fold(0) { acc, i -> acc + i }

val String.half: String
    get() = this.substring(0, length / 2)

// Android View için extension property
val View.isVisible: Boolean
    get() = visibility == View.VISIBLE

// Güvenli receiver ile null kontrolü
val String?.isNullOrBlank: Boolean
    get() = this == null || this.isBlank()

View için extension property isVisible — her Android geliştiricisinin bilmesi gereken bir örnektir. view.visibility == View.VISIBLE yerine view.isVisible yazabilirsiniz. Bu sadece daha kısa değil, aynı zamanda doğal dil gibi okunur: “görünüm görünürse”. Basitliğine rağmen, bu tür özellikler kod okunabilirliğini önemli ölçüde artırır.

Sıkça Sorulan Sorular

Bir companion object için extension property bildirilebilir mi?

Hayır, extension properties bir companion object veya object declaration için bildirilemez. Genişletme mekanizması yalnızca sınıflar, arayüzler ve nullable tipler için geçerlidir. Object için normal üst düzey fonksiyonlar kullanın.

Extension property'nin inline property'den farkı nedir?

Inline property (inline değiştiricisi ile) — bir özellik nesnesi oluşturmadan getter/setter çağırmak için bir Kotlin mekanizmasıdır. Extension property her zaman statik bir metoda derlenirken, inline property sarmalayıcı olmadan bir çağrıya derlenir. Farklı sorunları çözerler: extension property mevcut bir türe özellik ekler, inline ise kendi özelliklerinin çağrılarını optimize eder.

Extension properties annotasyonları destekler mi?

Evet, bir extension property annotasyonlara sahip olabilir, ancak yalnızca bildirim seviyesinde. Normal sınıf özelliklerinin aksine, bir extension property'nin getter veya setter'ı ayrı ayrı annotasyona tabi tutulamaz. Örnek: @JvmName("getIsValid") val String.isValid get() = true.

Bir sınıfın companion object'i ile extension property kullanılabilir mi?

Hayır, extension properties bir companion object ile receiver olarak bildirilemez. Bu bir dil sınırlamasıdır — extension property yalnızca tip örnekleriyle çalışır, oysa companion object statik bir bağlamdır. Üst düzey extension fonksiyonlar veya sabitler kullanın.

Extension property APK boyutunu etkiler mi?

Minimum düzeyde. Her extension property, derlenmiş bayt koduna bir statik getter metodu (ve isteğe bağlı olarak setter) ekler. Karşılaştırma için, aynı özelliğe sahip bir sarmalayıcı sınıf oluşturmak bütün bir sınıf ekler. Extension properties, işlevselliği genişletmek için daha hafif bir yaklaşımdır.

Özet

  • Extension property — kalıtım olmadan mevcut bir tip için hesaplanmış özellik
  • Backing field yok — durum depolanmaz, sadece getter ile hesaplanır
  • setter ile var — mümkün, ancak veri yazmak için harici depolama gerekir
  • Sözdizimi — receiver type ve zorunlu getter ile val/var
  • Performans — sıfır ek yük, statik metoda derlenir
  • Kullanım — hesaplanmış özellikler: uzunluk, durum, boyut, kontroller
  • Sınırlama — durum depolama, bellek yönetimi olmadan önbellekleme için uygun değil

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun