ProgrammierungBackend-Entwickler

Erklären Sie die Unterschiede zwischen Datenklassen (data classes), normalen Klassen und Klassen mit Vererbung in Kotlin. Wann sollte man data class verwenden und welche Einschränkungen hat der Compiler?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

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:

  • Der primäre Konstruktor muss mindestens einen Parameter enthalten.
  • Alle Parameter des Konstruktors müssen mit val oder var gekennzeichnet sein.
  • Data class darf nicht abstract, open, sealed oder inner sein.
  • Es wird nicht empfohlen, data class für Klassen mit Geschäftslogik oder Vererbungshierarchien zu verwenden.

Frage mit einem Haken

"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

Beispiele für reale Fehler aufgrund fehlender Kenntnisse über die Feinheiten des Themas


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.