ProgramlamaKotlin Geliştirici, Android Geliştirici

Kotlin'de data object nedir, nasıl kullanılır ve sıradan object ile data class'tan farkı nedir?

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

Cevap.

Data object — Kotlin'de (1.9 sürümünden itibaren) duyurulan yeni bir tanım türüdür; singleton nesne özelliklerini ve data class'ını birleştirir. Tek bir nesne örneğine sahip olmak ve otomatik olarak oluşturulan equals, hashCode, toString yöntemlerini (data class gibi) elde etmek için tasarlanmıştır.

Sorunun Tarihi

Önceden, otomatik olarak oluşturulmuş toString() ve equals() yöntemi olan benzersiz varlıkları saklamak için ya kendi uygulamalarını yazmak zorundaydık ya da tek bir nesne (örnek yerine) ile data class kullanmak zorunda kalıyorduk.

Problem

Singleton nesneleri (object) otomatik olarak oluşturulmuş equals, hashCode, toString'e sahip değildir, oysa data class çok sayıda örnek öngörür, bu da sınırlı enum-benzeri modeller için uygun değildir.

Çözüm

Data object ile birlikte her iki sorun da özlü bir şekilde çözülmüştür:

  • Sınıf sadece bir nesne örneği olabilir (singleton).
  • Derleyici gerekli çoklu yöntemleri üretir.

Kod örneği:

data object LoadingState data object NoData println(LoadingState == LoadingState) // true println(LoadingState.toString()) // LoadingState

Anahtar özellikler:

  • Her zaman singleton — ikinci bir nesne örneği yaratamazsınız.
  • Derleyici, data class için olduğu gibi equals, hashCode, toString yöntemlerini ekler.
  • Durumları modellemek için sealed interface ile birlikte kullanmak oldukça faydalıdır.

Aldatıcı Sorular.

Data object ile sıradan object arasındaki fark nedir?

Yalnızca data object derleyici düzeyinde equals, hashCode, toString yöntemlerinin otomatik oluşturulmasını alır; sıradan object, Any'den (referans eşitliği, zayıf toString) uygulamaları kullanır.

Parametreli constructor ile data object yapabilir miyim?

Hayır, data object'in parametreli bir constructor'u olamaz. Her zaman parametresizdir, çünkü sadece bir nesne örneği vardır.

Data object miras alabilir mi?

Evet, data object arayüzleri, sealed interface dahil olmak üzere uygulayabilir ve durum hiyerarşilerinin bir parçası olabilir.

Örnek:

sealed interface Result data object Success : Result data object Failure : Result

Yaygın Hatalar ve Anti-patentler

  • Data object'e constructor alanları eklemeye çalışmak (bu yasaktır).
  • Tek bir nesne örneği öngörülen yerlerde data class kullanmak.

Hayattan bir örnek

Olumsuz Vaka

Geliştirici "veri yok" durumunu object NoData olarak modelliyor, ardından equals() ile başka bir nesne ile karşılaştırıyor ve beklenmedik bir sonuç alıyor (referans kontrolü, değil içerik kontrolü).

Artıları:

  • Kolay tanım.

Eksileri:

  • equals/toString'de yetersiz davranış.

Olumlu Vaka

Data object, yükleme durumları için kullanılır; eşitlik ve yazdırma beklenen data class kurallarına göre gerçekleşir. Model katmanı güvenle durumlar üzerinde kalıp eşleşmesi kullanır.

Artıları:

  • Doğru çoklu yöntemlerin oluşturulması.
  • Güvenli karşılaştırma ve tanı teşhisi.

Eksileri:

  • Data object yalnızca Kotlin'in yeni sürümlerinde ortaya çıktı — eski projelerle uyumsuzluk riski vardır.