Data object — to nowy typ deklaracji w Kotlinie (od wersji 1.9), łączący właściwości singletona i data class. Jest przeznaczony do przypadków, gdy chcemy mieć tylko jeden egzemplarz obiektu oraz automatycznie generowane metody equals, hashCode, toString (jak w data class).
Wcześniej, aby przechowywać unikalne encje z automatycznie generowanymi metodami toString() i equals(), trzeba było pisać object z ręcznymi implementacjami lub kompromisowo używać data class z jedynym obiektem (a nie instancjami).
Obiekty singleton (object) nie mają automatycznie generowanych equals, hashCode, toString, podczas gdy data class zakłada wiele instancji, co nie nadaje się do wyczerpujących modeli enum-like.
Z pojawieniem się data object obie kwestie są rozwiązywane w przystępny sposób:
Przykład kodu:
data object LoadingState data object NoData println(LoadingState == LoadingState) // true println(LoadingState.toString()) // LoadingState
Kluczowe cechy:
Czym różni się data object od zwykłego object?
Tylko data object otrzymuje automatyczne generowanie metod equals, hashCode, toString na poziomie kompilatora; zwykły object korzysta z implementacji z Any (referencyjna równość, ubogie toString).
Czy można zrobić data object z parametrami konstruktora?
Nie, data object nie może mieć konstruktora z parametrami. Zawsze jest bez parametrów, ponieważ istnieje tylko jeden egzemplarz.
Czy można dziedziczyć data object?
Tak, data object może implementować interfejsy, w tym sealed interface, i być częścią hierarchii stanów.
Przykład:
sealed interface Result data object Success : Result data object Failure : Result
Programista modeluje "brak danych" jako object NoData, a następnie porównuje używając equals() z zewnętrznym obiektem i otrzymuje nieoczekiwany wynik (referencyjne porównanie, a nie zawartości).
Zalety:
Wady:
Używany jest data object do statusów ładowania, równość i drukowanie odbywają się zgodnie z oczekiwanymi zasadami data class. Model warstwy niezawodnie wykorzystuje dopasowanie wzorca do stanów.
Zalety:
Wady: