Kotlin Inline(Value) Class Hakkında Her Şey

Oguz Şahin
Huawei Developers - Türkiye
5 min readFeb 24, 2022

Herkese merhaba ✋. Bu yazıda Kotlin Inline Class hakkında her şeyi detaylı bir şekilde öğrenmeye çalışacağız.

Inline Class Nedir

Bazı durumlarda belli business logicleri sağlamak için wrapperlar(sarmalayıcılar) oluştururuz. Haliyle bu ek sınıflar runtime esnasında ek yükler oluşturduğunda bir performans kaybı da sağlar. Eğer ki sarmaladığınız bir primitive tip ise buradaki kullanım performans açısından korkunç hale gelebiliyor. Bu durumu çözmek için kotlin ekibi Inline Class adıyla yeni bir sınıf sundu.

Inline class bize bu durumda hem sınıf özelliği taşıyarak tip güvenliği sağlıyor hem de derlenilen kod tarafında bir primitive tip gibi davranarak gereksiz performans kaybından kurtarıyor. Aynı zamanda çok daha temiz, anlaşılır ve okunabilir bir kod yapısı da sunuyor.

Neden ekstra bir performans kaybı söz konusu? 🤔

from https://www.javatpoint.com/stack-vs-heap-java

Bir primitive tipte değişken oluşturduğumuzda bu JVM belleğinin stack denen birimde depolanır fakat yeni bir obje oluşturduğumuzda bu heap denen bölgede depolanır. Objeleri saklarken ve kullanırken daha pahalı bir işlem dönüyor arka tarafta. Bu heap ve stack olayını daha detayına inmek için linki inceleyebilirsiniz. Bahsettiğimiz kayıplar ölçülemeyecek derecede küçük. Fakat bütün bir kodda oluşturulan bir obje oluşturma işini düşünürsek fazladan bir ek yük oluşturacağı aşikar. Ek olarak biz yazılımcılar kodu daha temiz, anlaşılır ve performanslı yazmamız gerektiğini de unutmamamız lazım. Fakat bir kıyaslama yapıldığında primitive bir tip tanımlamak bir obje tanımlamaktan perfomans açısından daha verimli bir işlem. Bu sebeple bir wrapper classı pritimitive bir tip için yazıyorsak Inline class tercih ederek hem wrapper classın bize sağladığı daha flexible, okunabilir ve tip güvenliği gibi faydalarından yararlanırken hem de inline classın derlenen kod tarafında primitive tip gibi davranarak performans kaybını da yaşamamış olacağız.

from https://quickbirdstudios.com/blog/kotlin-value-classes/

Ayrıca yukarıda aynı işlemin 4 farklı şekilde yapıldığında, işlemin bizlere ne kadar süreye mal olucağının bir kıyası da mevcut.

Kullanımı ve Sınırları

Inline Class Tanımlama

🔹 Inline class tanımlamak için value keywordu yeterli oluyor.

🔹 Eğer ki JVM için bir kotlin kodu yazıyorsanız ek olarak @JvmInline anotasyonunu da eklememiz gerekiyor.

🔹 Tek bir primary constructor kullanabiliyoruz.

🔹 Zorunlu bir şekilde data class gibi bir property tanımlaması gerekli.

🔹 Sadece tek bir read only property tanımlayabiliyoruz primary constructorda.(var kabul edilmiyor. Sadece val keywordü)

🔹 Member read only propertyler tanımlayabiliriz ve değerleri singleton, top-level object veya constantlardan olabilir.(backing fileda izin verilmiyor.)

🔹 init bloğu normal class gibi burada da kullanılabilir.

🔹 Üye fonksiyonlar tanımlanabilir.

🔹 Herhangi bir sınıftan kalıtım alamazlar veya herhangi bir sınıf inline classtan kalıtım alamaz.

🔹 Bir interface implemente edebilirler.

Mangling

Mangling

Yukarıdaki ekte iki fonksiyon mevcut. Bunlardan bir tanesi bizim value class türünde parametre alırken diğeri int türünde parametre alıyor. Bu kodun derlendiği taraftaki kodda biraz değişiklik var. Gördüğünüz gibi value class öncelikle bir primitive tip gibi derlenmiş. Bu da belli başlı hatalara yol açabilir. Örneğin yukarıdaki iki fonksiyonu düşünün. Burada distance türü derlenirken JVM tarafında int türünde olacağı için bir çakışma söz konusu olacak. Bu hataların önüne geçmek için inline class derlenirken fonksiyon ismi bir karıştırmaya tabi tutuluyor. Sağ tarafta derlenen koda baktığınızda getPrice<hashcode> şeklinde derlendiği görülebiliyor.

Eğer ki ilk fonksiyonu java tarafından çağırmak isteseydik bunu içinde mangling olayını inaktif etmemiz lazım.@JvmNameanotasyonunu ekleyerek gerçekleştirebiliriz. Bu anotasyonu ekleyerek verdiğimiz name argumenti derlenen koddaki fonksiyon ismi olacaktır. Biz de bu fonksiyon ismi üzerinden java classlarından çağırım yapabiliriz.

Mangling inaktif

Type Alias vs Inline Class

Inline class kullanımı type alias kullanımı ile çok benzer yapıda olduğunu söyleyebiliriz. Fakat bazı farklılıkları da söz konusu. Her ikisi de yeni bir tip oluşturuyor gibi görünsede type alias da yaptığımız şey türün isminin yerine geçmesi. Örneğin String türü için farklı bir ad atıyormuşuz gibi düşünebiliriz. Inline class kullanımında ise yeni bir tür oluşturmuş oluyoruz. Bu da bize daha temiz anlaşılır bir kod yapısı ile beraber aynı zamanda tip güvenliği de sunmuş oluyor.

from https://kotlinlang.org/docs/inline-classes.html#inline-classes-vs-type-aliases

Sonuç

Bu yazımızda Inline class hakkında her detayı öğrenmeye çalıştık. Inline class kullanımı performans açısından sağladığı avantaj ile birlikte sağladığı tip güvenliği ile de kodun daha temiz ve okunaklı yazılması konusunda bizlere güzel şeyler vadediyor. Bir sonraki yazılarda görüşmek üzere 👋👋.

--

--