ProgrammatieBackend ontwikkelaar

Leg de verschillen uit tussen data classes, gewone klassen en klassen met overerving in Kotlin. In welke gevallen moet een data class worden gebruikt en welke beperkingen legt de compiler op?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

In Kotlin zijn data classes bedoeld voor het opslaan van gegevens. De compiler genereert automatisch de methoden equals(), hashCode(), toString(), evenals de functies copy() en componentN(), die het werken met dergelijke objecten aanzienlijk vergemakkelijken:

data class User(val name: String, val age: Int) val u1 = User("Ivan", 30) val u2 = u1.copy(age = 31)

Gewone klassen hebben dergelijke automatisch gegenereerde methoden niet; alles moet handmatig worden geschreven. Een data class wordt beter gebruikt voor DTO's, modellen en datastructuren.

Beperkingen van data class:

  • De primaire constructor moet minstens één parameter bevatten.
  • Alle parameters van de constructor moeten zijn gemarkeerd als val of var.
  • Een data class kan niet abstract, open, sealed of inner zijn.
  • Het wordt niet aanbevolen om data classes te gebruiken voor klassen met bedrijfslogica of een overervingshiërarchie.

Vragende val

"Kan een data class worden gedeclareerd met overerving van een andere data class? Waarom (of waarom niet)?"

Nee, het is niet toegestaan om een data class rechtstreeks van een andere data class over te erven. Een data class kan alleen overerven van een interface of een gewone klasse (geen data class). Dit is gedaan om verwarring met de automatisch gegenereerde methoden te voorkomen (bijvoorbeeld, het kopiëren van geërfde eigenschappen is niet voor de hand liggend).

data class Base(val id: Int) data class Child(val name: String) : Base(1) // Compilerfout: niet toegestaan

Voorbeelden van echte fouten door gebrek aan kennis over de nuances van het onderwerp


Verhaal

In een bankproject werden data classes gebruikt met bedrijfslogica en overerving. Na het toevoegen van een nieuw veld werd het onmogelijk om objecten correct te kopiëren, raakte een deel van de bedrijfslogica verloren (methoden werden niet geërfd), wat leidde tot fouten in de kostenberekeningen.


Verhaal

In een e-commerceplatform werd een data class gebruikt voor het opslaan van de status van de gebruikersmand. Na een statusupdate via copy(), vergaten ze dat de interne lijsten niet diep werden gekopieerd. Dit leidde tot het "lekken" van gegevens tussen gebruikerssessies.


Verhaal

In een project met integratie van een externe API leidde de serialisatie van data classes naar JSON tot het verschijnen van velden met privé zichtbaarheid, wat het API-contract schond en leidde tot fouten aan de klantzijde.