Sobes.tech
Middle

İç içe fonksiyonlar kullanılırken ne zaman aşırı yüklenme olur?

sobes.tech yapay zeka

AI'dan gelen yanıt

Kotlin'de inline fonksiyonların (inline functions) aşırı yüklenmesi (overloading) geleneksel anlamda çalışma zamanında polimorfizm değildir. Bir inline fonksiyon, derleme sırasında çağrı yerine gömülür. Bu nedenle, inline fonksiyonlarla ilgili "aşırı yükleme" teriminden bahsederken, genellikle derleyicinin farklı çağrı bağlamları için gömülü kodun birkaç sürümünü üretme yeteneğine atıfta bulunuruz, özellikle de jeneriklerin kullanılması durumunda.

Ana noktalar:

  • Derleme zamanında özelleştirme: Jenerik (reified) ile inline fonksiyonlar için, derleyici her belirli tüpü yerine koymak için kodun özelleştirilmiş sürümlerini üretir. Bu, çalışma zamanında değil, derleme sırasında gerçekleşir.
  • Ek yükü önleme: Inline işleminin amacı, fonksiyon çağrısıyla ilgili maliyetleri ortadan kaldırmaktır. Jenerikler için özelleştirme, temel türlerin paketlenmesini ve Java'da tür silme ile ilgili diğer maliyetleri önlemeye olanak tanır.
  • Polimorfizm değil: Bu, çalışma zamanında nesnenin gerçek türüne bağlı olarak çağrılan klasik polimorfizm değildir. Burada, fonksiyonun "sürümü" derleme zamanında seçilir.

reified ile inline fonksiyon kullanımı örneği:

inline fun <reified T> printType(value: T) {
    // Derleyici, her T (Int, String, vb.) için ayrı kod üretecektir
    println("Tür: ${T::class.java.name}")
}

fun main() {
    printType(123) // T = Int için kod üretilir
    printType("Merhaba") // T = String için kod üretilir
}

Bu durumda, sözdizimsel olarak yalnızca bir printType fonksiyonunu çağırmamıza rağmen, derleyici gömülü kodun iki farklı sürümünü üretir: biri Int için, diğeri String için. Bu, "aşırı yükleme" veya daha doğrusu, derleme zamanında özelleştirme olarak görülebilir; bu, inline mekanizması sayesinde gerçekleşir ve çalışma zamanındaki polimorfizm değil, derleme zamanında gerçekleşir.