Inline Class(Value Class) Nedir?
Selamlar 👋, Bugünkü konumuz Inline Class’lar. Ne oldukları, nasıl kullanılmaları gerektiği gibi konulara değineceğim. İyi okumalar ✨
🔹 Inline Class Nedir?
- Inline class ya da Value class olarak bilinir.
- Yazım şeklinde class’ın başına value keyword’ü koyulur.
- Primary constructor’ı tek bir parametre alır. (Tek bir parametre alıyor olması infix fonksiyona benzemektedir. Infix fonksiyonunda da tek bir parametre alımına izin vardı.) İkinci bir parametrenin class içerisinde oluşturulmasına izin vermez.
Peki tek bir parametre alabiliyorsa bu class türü, ben constructor içerisine vararg tanımlasam olmaz mı? Böylece birden fazla parametre almış olurum.🤔
Hayır. vararg tanımlanamaz. Tanımladığınız zaman Ide size hata verecektir. Primary constructor içerisine sadece tek bir parametre vermeniz gerekmektedir.
- Primary constructor içerisine yazılan parametre val ile tanımlanmalıdır. var ile yazınca size hata verecektir.
- Başına @JvmInline annotation’ı koyulur.
Bu bahsettiklerimizden sonra yazım şekline bir bakalım.
- Inline class’ların nesnesi oluşturulamaz. Neden ama? 🤔
Hemen Show Kotlin ByteCode’u açıp bakalım.
Çünkü constructor’ı arka planda private olarak tutulmaktadır.
❗️ Ancak her ne kadar nesne oluşturmaya izin vermese de biz nesne oluşturuyor gibi gözükürüz. Nasıl yani? Şöyle;
Yukarıdaki örnekte main fonksiyonu içerisinde sanki UserInfo Class’nın nesnesi oluşturuluyor gibi gözükmekte ancak her ne kadar öyle gözükse de orada nesne oluşturulmuyor. Primitive tipli bir değişken oluşturulmakta. Biz buna unboxed değişken diyoruz. Şimdi şu iki kelimeyi öğrenelim ilk önce.
Unboxed : Değişkenin primitive tipli olarak tutulması
Boxed : Değişkenin referans tipli olarak(bir class’ın nesnesi) tutulması
Eğer şu şekilde bir kullanım olsaydı;
İşte burada yani Car class’ndan nesne oluşturulduğunu görmekteyiz. Oluşturulan referans tipli bir değişkendir. Yani bir class’ın nesnesini oluşturmuş olduk.
Ancak userInfo primitive tipli bir değişkendir. Şu şekilde yazıldığında daha net anlayacaksınız primitive tipli olmasını.
- İki tanımında memory’ de kapladığı alan aynı oluyor.
- Peki bunun ne gibi bir artısı var bize? Yani Inline class kullanılarak nesne değil de primitive tipli bir değişken oluşuyorsa bana ne katkısı var? 🤔
Şöyle ki referans tipli bir değişkene erişmek daha maliyetlidir. Aynı zamanda referans tipli değişkenlerin kapladığı alan primitive tiplere göre daha fazla olacaktır.
- Inline class’lar miras alamazlar ya da miras olarak verilemezler. (Arka planda default olarak final’dır.)
Hemen bakalım arka planda nasıl tutuluyor.
- Sealed ya da abstract keyword’ leri ile birlikte kullanılmaz.
- Interface implement edilebilir. Implement edildikten sonra override işlemi de yapılmalıdır.
- Inline class kullanımında arka tarafta default olarak equals, hashCode ve toString oluşturulmakta.
Show Kotlin ByteCode’ a bakalım.
toString, hashCode, equals bize içerdeki değişkeni vermekte.
gif kaynak : This Is How It Ends The End GIF by Breaking Bad — Find & Share on GIPHY (2022). Available at: https://giphy.com/gifs/this-is-the-end-it-how-ends-3oEjI8Kq5HhZLCrqBW