Ich möchte einige "Daten" -Klassenobjekte in ähnliche "Daten" -Klassenobjekte konvertieren / zuordnen. Zum Beispiel Klassen für Webformulare zu Klassen für Datenbankeinträge.
data class PersonForm(
val firstName: String,
val lastName: String,
val age: Int,
// maybe many fields exist here like address, card number, etc.
val tel: String
)
// maps to ...
data class PersonRecord(
val name: String, // "${firstName} ${lastName}"
val age: Int, // copy of age
// maybe many fields exist here like address, card number, etc.
val tel: String // copy of tel
)
Ich verwende ModelMapper für solche Arbeiten in Java, aber es kann nicht verwendet werden, da Datenklassen endgültig sind (ModelMapper erstellt CGLib-Proxys zum Lesen von Zuordnungsdefinitionen). Wir können ModelMapper verwenden, wenn wir diese Klassen / Felder öffnen, aber wir müssen Funktionen der Klasse "data" manuell implementieren. (Siehe ModelMapper-Beispiele: https://github.com/jhalterman/modelmapper/blob/master/examples/src/main/java/org/modelmapper/gettingstarted/GettingStartedExample.java )
Wie ordne ich solche "Daten" -Objekte in Kotlin zu?
Update: ModelMapper ordnet automatisch gleichnamige Felder (wie tel -> tel) ohne Mapping-Deklarationen zu. Ich möchte es mit der Datenklasse von Kotlin machen.
Update: Der Zweck jeder Klasse hängt von der Art der Anwendung ab, diese werden jedoch wahrscheinlich in der verschiedenen Ebene einer Anwendung platziert.
Zum Beispiel:
- Daten aus der Datenbank (Datenbankentität) zu Daten für das HTML-Formular (Modell / Ansichtsmodell)
- REST-API-Ergebnis zu Daten für die Datenbank
Diese Klassen sind ähnlich, aber nicht gleich.
Ich möchte normale Funktionsaufrufe aus folgenden Gründen vermeiden:
- Dies hängt von der Reihenfolge der Argumente ab. Eine Funktion für eine Klasse mit vielen Feldern desselben Typs (wie String) kann leicht beschädigt werden.
- Viele Deklarationen sind notwendig, obwohl die meisten Zuordnungen mit Namenskonventionen aufgelöst werden können.
Natürlich ist eine Bibliothek mit ähnlichen Funktionen vorgesehen, aber auch Informationen über die Kotlin-Funktion sind willkommen (wie das Verbreiten in ECMAScript).