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:
Dezavantajlar:
Öneri: Performansı artırmak için kritik kod bloğunda sıkça lambda kullanıyorsanız inline kullanın.
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.
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ı.