Kotlin, ilkel türler ve küçük yapılar üzerinde çalışırken runtime aşımını en aza indirmek amacıyla inline/değer sınıfları (şu anda değer sınıfı olarak adlandırılıyor) kavramını tanıttı. Bu fikir, diğer dillerden (örn. C# struct'ları) alınmıştır; bu tür bir optimizasyon, tipe dayalılığın kaybı olmaksızın performansı artırmak için faydalıdır.
Optimizasyon yapılmadan (örneğin, varlık türleri veya kimlikler için) sarmalayıcı sınıflar oluşturulması, bellekte ek bir nesne yaratarak performansı, GC’yi etkiler ve Boxing/Unboxing aşımına yol açabilir. Sık sık tam bir tip güvenliği (örneğin, Int yerine UserId) istenir; ancak gerçek nesne yaratmadan.
Değer sınıfı, value anahtar kelimesi ile tanımlanır. Çoğu durumda JVM ek bir nesne oluşturmaz; değer sınıfı doğrudan kendi alanı ile değiştirilir (inlining). Bu, tip güvenliği sağlar ve 'sadece Int'e' yakın bir performans sunar.
Kod örneği:
@JvmInline value class UserId(val value: Int) fun showId(id: UserId) = println(id.value) val id = UserId(15) showId(id) // Ayrı bir UserId nesnesi oluşturulmadan
Ana özellikler:
Değer sınıflarının birden fazla özelliği olabilir mi?
Hayır, değer sınıfı yalnızca bir özellik içerebilir.
// Hata: // value class Money(val amount: Int, val currency: String)
Nullable özelliğe sahip değeri sınıfı oluşturulabilir mi?
Değer sınıfındaki value alanı nullable olamaz — yalnızca null olmayan türler.
// Hata: // value class Name(val value: String?)
Değer sınıflarında kalıtım kullanılabilir mi?
Değer sınıfı kalıtımı desteklemez ve soyut veya sealed olamaz.
// Hata: // value class NewId(val value: Int): BaseId()
Geliştirici, iki özelliği olan bir varlık için değer sınıfı oluşturdu (örneğin, bir Int ve String çifti) ve derleme hatası aldı.
Artılar:
Geliştirici, bir alanı olan bir kimlik türü için değer sınıfı kullanıyor (örneğin, UserId), bu hızlı ve güvenli bir şekilde çalışıyor.
Artılar: