In Kotlin sind data class dafür gedacht, Daten zu speichern. Der Compiler generiert automatisch die Methoden equals(), hashCode(), toString() sowie die Funktionen copy() und componentN(), was die Arbeit mit solchen Objekten erheblich erleichtert:
data class User(val name: String, val age: Int) val u1 = User("Ivan", 30) val u2 = u1.copy(age = 31)
Normale Klassen haben solche automatisch generierten Methoden nicht; alles wird manuell geschrieben. Data class sollten besser für DTOs, Modelle und Datenstrukturen verwendet werden.
Einschränkungen von data class:
val oder var gekennzeichnet sein.abstract, open, sealed oder inner sein."Kann man eine data class mit Vererbung von einer anderen data class deklarieren? Warum (oder warum nicht)?"
Nein, man kann eine data class nicht direkt von einer anderen data class erben. Data class kann nur von einem Interface oder einer normalen Klasse (nicht data class) erben. Dies wurde eingeführt, um Verwirrung mit den automatisch generierten Methoden zu vermeiden (zum Beispiel ist das Kopieren geerbter Eigenschaften nicht offensichtlich).
data class Base(val id: Int) data class Child(val name: String) : Base(1) // Kompilierungsfehler: nicht erlaubt
Geschichte
In einem Bankprojekt wurden data class mit Geschäftslogik und Vererbung verwendet. Nach dem Hinzufügen eines neuen Feldes wurde es unmöglich, die Objekte korrekt zu kopieren, ein Teil der Geschäftslogik ging verloren (Methoden wurden nicht geerbt), was zu Fehlern bei der Berechnung von Gebühren führte.
Geschichte
In einer E-Commerce-Plattform wurde eine data class verwendet, um den Zustand des Warenkorbs des Benutzers zu speichern. Nach der Aktualisierung des Zustands über
copy()wurde vergessen, dass interne Listen nicht tief kopiert werden. Dadurch kam es zu einem "Überlaufen" von Daten zwischen den Benutzersitzungen.
Geschichte
In einem Projekt mit der Integration einer externen API führte die Serialisierung einer data class in JSON zu Feldern mit privater Sichtbarkeit, was den API-Vertrag verletzte und zu Fehlern auf der Clientseite führte.