Soru Tarihi:
Kotlin'de özelliklere erişim, getter ve setter metodları aracılığıyla sağlanır. Daha iyi performans sağlamak amacıyla geliştiriciler, JVM'in derleme sırasında çağrıları optimize etmesine olanak tanıyan inline modifikatörünü erişimciler için eklemişlerdir; bu, get/set gövdesini doğrudan çağıran koda yerleştirir.
Sorun:
Normal erişimci metodları her özellik için oluşturulur; bu da çağrı üzerindeki yükü artırır (özellikle onlara sık sık erişildiğinde). Geliştiriciler bazen mantığı ayrı bir get/set içine koyar, ancak fonksiyon çağrısı üzerindeki yükten kurtulmak isterler.
Çözüm:
Getter veya setter'ın uygulaması kısa ve ağır bir kod yoksa, inline modifikatörünü kullanın. Bu, özellikle hot-path'te yükü azaltır. Dikkat edin — inlining yalnızca top-level özellikler ve companion object ile object nesneleri için çalışır ve sınıflar içinde değil, JVM miras alma prensipleri nedeniyle.
Kod örneği:
inline var Int.asHex: String get() = Integer.toHexString(this) set(value) {} inline val String.firstUpperCase: String get() = if (isEmpty()) this else this[0].uppercase() + substring(1)
Anahtar özellikler:
Normal sınıf özellikleri ile inline get/set kullanabilir miyiz?
Hayır, getter ve setter için inlining yalnızca top-level veya object (companion object dahil) özelliklere izin verilir, sınıflar içindeki özelliklere değil, miras alma ile ilgili sorunları önlemek için.
Inline erişimcide backing field'e (destek alanı) erişim var mı?
Hayır, inline erişimci backing field'a sahip değildir, ona erişim denemesi derleme hatasına yol açar.
Inline erişimcinin bytecode üzerinde her zaman etkisi var mı?
Inlining, yalnızca derleyiciye kodu yerleştirme olanağını önerir. JIT derleyicisi bazı durumlarda bunu göz ardı edebilir. Ayrıca, eğer erişimci ağır bir mantık içeriyorsa, elde edilen etki ters olabilir.
Bir projede büyük bir özellik inline olarak tanımlandı, fakat getter içinde döngüde kullanılan ağır bir dönüşüm işleniyor. Sonuç — nihai bytecode şişiyor, JIT inlining'i kapatıyor, performans düşüyor.
Artılar:
Eksiler:
Bir sayıyı dizeye dönüştürmek için inline val tanımlandı. Getter, UI kodunda sıkça çağrılıyor. Performans yüksek kaldı, bytecode kompakt.
Artılar:
Eksiler: