ProgramlamaBackend Geliştirici

Kotlin'de inline (değer) sınıflar nedir, ne için kullanılır ve kullanımında hangi kısıtlamalar vardır?

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

Cevap.

Sorunun Tarihi

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.

Problem

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.

Çözüm

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:

  • Sınıf yalnızca bir özellik (val veya var) içermelidir, ancak bu tür nullable olamaz
  • Kalıtım desteği yoktur (değer sınıfı kalıtım yapamaz veya kalıtım alınamaz)
  • Bazı kısıtlamalar: init bloğu olamaz, lateinit veya başlangıçta atanmış özellikler tutamaz, refleksiyon her durumda kullanılamaz.

Yanlış sorular.

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()

Tipik hatalar ve anti-paterni

  • Birden fazla alanı olan karmaşık yapılar için değer sınıfı kullanma girişimi
  • Değer sınıfları aracılığıyla null olabilen değerleri saklama
  • Referans yöntemleri kullanma (örneğin, equals/hashCode yöntemleri, derlenmiş arka planda beklenmedik davranışlar sergileyebilir)

Hayat örneği

Olumsuz durum

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:

  • Sıkı bir tip elde etmeye çalışıyor Eksiler:
  • Çalışmıyor, derleme mümkün değil

Olumlu durum

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:

  • Kısa ve güvenli kod
  • Runtime aşımı yok Eksiler:
  • Sadece bir nullable olmayan tür ile kullanılabilir