ProgramlamaKotlin Backend Developer

Kotlin'da inline fonksiyonlar nedir, performansı nasıl etkiler ve ne zaman kullanılmaları mantıklıdır?

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

Cevap

Kotlin'de inline fonksiyonlar inline anahtar kelimesi ile tanımlanır ve derleyiciye fonksiyonun gövdesini çağrıldığı yerlerde doğrudan "yerleştirmesi" talimatı verir. Bu, özellikle lambda ifadeleri veya kısa fonksiyonlar kullanıldığında fonksiyon çağrısı üzerindeki maliyetleri düşürür ve kapanışları yakalamak için ek nesnelerin ayrılmasını engeller.

Örnek:

def inline fun synchronized(lock: Any, block: () -> Unit) { kotlin.synchronized(lock) { block() } }

Ana avantajlar:

  • Fonksiyon çağrıları üzerindeki ek maliyetlerin azaltılması
  • Lambda fonksiyonları için nesne tahsisinden kaçınma imkanı

Dezavantajlar:

  • Bayt kodunun boyutunun artması (kod kopyalanıyor)
  • Büyük fonksiyonlar için önerilmez

Öneri: Performansı artırmak için kritik kod bloğunda sıkça lambda kullanıyorsanız inline kullanın.

Kandırmaca Sorusu

Reified type parametreleri ile çalışırken inline fonksiyonlar için hangi sınırlama vardır?

Yanlış cevap genellikle: "Reified türler, herhangi bir inline fonksiyonun içinde her zaman erişilebilir."

Doğru cevap: Sadece inline fonksiyonlar, generic tanımlarında reified düzenleyicisini kullanabilir, bu da türü çalışma zamanında erişilebilir hale getirir:

inline fun <reified T> getTypeName() = T::class.java.name

Normal generic fonksiyonlarda T türüne çalışma zamanında erişim olmayacaktır.

Konunun inceliklerini bilmemekten kaynaklanan gerçek hatalar örnekleri


Hikaye

Kötü kullanılan inline, şişirilmiş APK'ya yol açtı: Android projesi ekibinde programcılar birçok yardımcı fonksiyonu inline olarak işaretledi, büyük karmaşık gövdelere sahip fonksiyonlar dahil. Sonuç — APK boyutu, çağrı yerlerindeki fonksiyon kopyalamalarından dolayı neredeyse 2 MB arttı.


Hikaye

Lambda'lar ve özel değişkenlere erişim hatası: Lambda ile birlikte bir inline fonksiyonu kullanıldı, içinde sınıfın özel üyelerine erişildi. Fonksiyon dış modüle taşındıktan sonra kod derlenemedi (yetkiler ihlal edildi), bu durum sadece CI'de fark edildi.


Hikaye

Inline fonksiyon dışında reified kullanımı: Geliştiricilerden biri, inline düzenleyicisi olmadan reified generik parametresi ile bir fonksiyon tanımlamaya çalıştı. Kod derlenmedi ve yeni başlayan biri için neden "T::class" inline fonksiyonlar dışında erişilemez olduğu uzun bir soruşturma eşliğinde anlaşıldı.