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:
val of var.abstract, open, sealed of inner zijn."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
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.