ProgramlamaKotlin Geliştiricisi

Kotlin'de Data Object'lar (veri nesnesi) nasıl çalışır, ne amaçla kullanılır, equals/hashCode/toString nasıl uygulanır ve normal object ile data class'tan ne farkı vardır?

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

Cevap.

Soru Tarihi:

Kotlin 1.9'dan önce object nesneleri data olamazdı; data sınıfları gibi otomatik olarak equals, hashCode, toString elde edilemezdi. data object ile bu kısıtlama kaldırıldı. Artık, değer ve Enum benzeri desenler için uygun, otomatik üretilen yöntemlere sahip bir singleton nesne oluşturmak mümkün.

Sorun:

Önceden, singleton nesnelerin bile doğru equals(), hashCode(), toString() alabilmesi için bunları manuel olarak uygulamak veya başka hileler kullanmak gerekiyordu, bu da BOILERPLATE'yi artırıyor ve hata olasılığını yükseltiyordu.

Çözüm:

Eşsiz bir örneği olan nesneler için ve koleksiyonlara, seri hale getirmeye, karşılaştırmaya ve hata ayıklamaya standart davranış olan equals/hashCode/toString gerektirdiğinde data object kullanın.

Kod örneği:

data object NotAvailable fun checkStatus(status: Any) = when (status) { NotAvailable -> "Veri mevcut değil" else -> "Diğer durum" } val set = setOf(NotAvailable) println(NotAvailable in set) // true println(NotAvailable.toString()) // NotAvailable

Anahtar özellikler:

  • Data object, data class sözleşmesine göre equals/hashCode/toString uygular
  • Bu bir singleton nesnedir (tek örnek)
  • Veri olmadan value-like veya enum-like desenler için uygundur

Kapalı Sorular.

Data object özellik içerebilir mi?

İçerebilir, ancak sadece backing field olmayan val özellikleri içermelidir (çünkü singleton'da depolanan bir şey olmamalıdır)

data object Loading { val status: String get() = "Yükleniyor..." }

Data object ile normal object'in equals açısından farkı nedir?

Normal object'deki equals sadece referans kimliğini kontrol ederken, data object'in sözleşmesi karşılaştırılır, ancak singleton durumunda her zaman aynı nesne olur. Ancak, yeniden tanımlanan equals/hashCode koleksiyonlar için daha yararlıdır.

Data object'ten miras almak mümkün mü?

Hayır, data object sonlu bir nesnedir; Kotlin'deki herhangi bir object gibi miras alınamaz.

Tipik Hatalar ve Antipattern'lar

  • Birden fazla nesne varsa enum yerine data object kullanmak
  • Veri saklamaya çalışarak data object kullanmak — bu mümkün değildir
  • Eşitliğin her zaman referansa dayalı olduğunu dikkate almamak, ancak koleksiyonların değerine göre karşılandığını öngörmek

Gerçek Hayattan Örnek

Olumsuz Durum

Tüm durumlar için enum yerine farklı data object'ler kullanıldı. Bir yıl sonra stringler üzerinden seri hale getirme gereği doğdu, nesne adlarını türlerle manuel olarak eşleştirmeye başladılar.

Artılar:

  • Kolay başlatma

Eksiler:

  • Seri hale getirme için gereksiz takviyeler, eşleştirmede hata

Olumlu Durum

Ağ isteği döndürülürken özel durumlar için data object kullanıldı: Loading, Empty, Error. Böylece kod kompakt, equals, hashCode, toString destekleniyor otomatik olarak.

Artılar:

  • Koleksiyonlarda kontrol için kullanışlı
  • Güzel bir günlükleme

Eksiler:

  • Değişken özellik eklemek mümkün değil, yalnızca val-lazy