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 ö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.
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:
Eksiler:
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:
Eksiler: