ProgrammatieKotlin-ontwikkelaar, Android-ontwikkelaar

Wat is een data object in Kotlin, hoe het te gebruiken, en wat is het verschil met een gewone object en data class?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Data object is een nieuw type declaraties in Kotlin (vanaf versie 1.9), dat de eigenschappen van een singleton-object en data class combineert. Het is bedoeld voor gevallen waarin je maar één exemplaar van een object wilt hebben en automatisch gegenereerde methoden zoals equals, hashCode, toString (zoals bij data class).

Geschiedenis van de vraag

Voorheen was het nodig om een object met handmatig geïmplementeerde methoden te schrijven om unieke entiteiten met automatisch gegenereerde toString() en equals() op te slaan, of er was een compromis nodig om een data class met een enkel object (in plaats van exemplaren) te gebruiken.

Probleem

Singleton-objecten (object) hebben geen automatisch gegenereerde equals, hashCode, toString, terwijl een data class meerdere exemplaren veronderstelt, wat niet geschikt is voor uitputtende enum-achtige modellen.

Oplossing

Met de komst van data object worden beide taken beknopt opgelost:

  • De klasse kan slechts één exemplaar zijn (singleton).
  • De compiler genereert de benodigde multimethoden.

Codevoorbeeld:

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

Belangrijkste kenmerken:

  • Altijd singleton — je kunt geen tweede exemplaar maken.
  • De compiler voegt methoden equals, hashCode, toString toe zoals voor data class.
  • Vooral handig in combinatie met sealed interface voor het modelleren van toestanden.

Vragen met een addertje onder het gras.

Wat is het verschil tussen data object en een gewone object?

Slechts data object krijgt automatisch gegenereerde methoden zoals equals, hashCode, toString op compilatieniveau; een gewone object gebruikt implementaties van Any (referentiële gelijkheid, beperkte toString).

Kan je een data object met constructorparameters maken?

Nee, een data object kan geen constructor met parameters hebben. Het is altijd parameterloos, omdat er slechts één exemplaar bestaat.

Kan een data object geërfd worden?

Ja, een data object kan interfaces implementeren, waaronder sealed interface, en deel uitmaken van hiërarchieën van toestanden.

Voorbeeld:

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

Typische fouten en anti-patronen

  • Poging om constructorvelden toe te voegen aan data object (dit is verboden).
  • Gebruik van data class, waar wordt aangenomen dat er slechts één exemplaar is.

Voorbeeld uit het leven

Negatieve case

Een ontwikkelaar modeleert "geen gegevens" als object NoData, vergelijkt dan met een extern object met equals() en krijgt een onverwacht resultaat (referentiële vergelijking in plaats van inhoudelijke).

Voordelen:

  • Eenvoud van declaratie.

Nadelen:

  • Ongepast gedrag bij equals/toString.

Positieve case

Er wordt een data object gebruikt voor laadstatussen, gelijkheid en afdrukken gebeurt volgens de verwachte data class-regels. De modellaag gebruikt betrouwbaar patroonmatching op toestanden.

Voordelen:

  • Juiste generatie van multimethoden.
  • Veilige vergelijking en diagnose.

Nadelen:

  • Data object is pas verschenen in nieuwe versies van Kotlin — er is een risico van incompatibiliteit met oudere projecten.