ProgramlamaBackend Geliştirici

Kotlin'de 'inline class' (değer sınıfı) nedir? Ne için kullanılır, nasıl doğru bir şekilde kullanılır, bu tür sınıfların kısıtlamaları ve özellikleri nelerdir? Kod örnekleri verin.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

inline class (Kotlin 1.5 ile — value class), çalıştırma sırasında ayrı bir nesne oluşturmadan, ilkel türler için sarmalayıcılar oluşturmanıza olanak tanır. Bu, bellek tahsisi üzerine yük olmadan tür güvenliğini artırmak için kullanılır. Altında, bu tür nesneler uygun ilkel tipe derlenebilir.

Örnek:

@JvmInline value class UserId(val id: String) fun printUserId(userId: UserId) { println(userId.id) }
  • Sadece bir özellik (ana alan) izin verilir.
  • Argüman almayan bir kurucu olamaz.
  • Sınıf durum (örneğin, var alanları) içermemelidir, sadece val.
  • Diğer sınıflardan miras alınamaz, ancak arayüzler uygulanabilir.
  • Java kodu ile etkileşim bazen belirsiz olabilir - boxing/unboxing olasılığı vardır.

Inline/değer sınıflarının kullanımı, kimlikler, para, ölçü birimleri vb. için tip güvenliği açısından önemlidir.

Hmm Sorusu

Değer sınıfının birden fazla özelliği olabilir mi?

Cevap: Hayır. Değer sınıfı, birincil yapıcıda yalnızca bir özellik içerebilir.

Hatalı kod örneği:

@JvmInline value class Money(val amount: Int, val currency: String) // Derleme hatası

Bu konuya dair bilgi eksikliğinden kaynaklanan gerçek hata örnekleri


Hikaye

Bir döviz bürosunda, miktarı ve para birimini tanımlamak için inline sınıf kullanılmıştır. Değer sınıfına iki alan eklemeye çalıştıklarında derleme hatası aldılar ve kısıtlamayı aşmanın yollarını aramak için biraz zaman harcadılar. Sonunda ayrı bir veri sınıfı yapmaya karar verdiler.


Hikaye

Yerli bir Java kütüphanesi ile entegrasyonda inline sınıf bazen nesneye (boxing) dönüşerek beklenmedik bir şekilde performansı etkiledi. Dokümantasyonu inceleyerek sıradan bir değer nesnesi ile değiştirdiler.


Hikaye

Mikro hizmetlerden oluşan bir projede, değer sınıfı API'deki kimlikler olarak kullanıldı. Bir hizmet doğrudan bir dize döndürürken, diğer bir değer sınıfı döndürdü, bu da Jackson ile seri hale getirme çatışmasına yol açtı. Kimlik ve dize arasında açık bir eşlemeyle düzeltildi.