Я хочу преобразовать/отобразить некоторые объекты класса данных в похожие объекты класса данных. Например, классы для веб-формы для классов для записей базы данных.
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
)
Я использую ModelMapper для таких работ в Java, но его нельзя использовать, поскольку классы данных являются окончательными (ModelMapper создает прокси CGLib для чтения определений отображения). Мы можем использовать ModelMapper, когда мы открываем эти классы/поля, но мы должны внедрять функции класса данных вручную. (см. примеры ModelMapper: https://github.com/jhalterman/modelmapper/blob/master/examples/src/main/java/org/modelmapper/gettingstarted/GettingStartedExample.java)
Как сопоставить такие объекты данных в Kotlin?
Update: ModelMapper автоматически отображает поля с таким же именем (например, tel → tel) без объявлений сопоставления. Я хочу сделать это с классом данных Kotlin.
Update: Назначение каждого класса зависит от того, какое приложение, но возможно, оно размещено на другом уровне приложения.
Например:
- данные из базы данных (объект базы данных) для данных для формы HTML (модель/модель представления)
- Результат REST API для данных для базы данных
Эти классы схожи, но не совпадают.
Я хочу избежать обычных вызовов функций по следующим причинам:
- Это зависит от порядка аргументов. Функция для класса со многими полями одного типа (например, String) будет легко разбита.
- Многие объявления являются необязательными, хотя большинство сопоставлений можно разрешить с помощью соглашения об именах.
Конечно, библиотека, имеющая аналогичную функцию, предназначена, но информация о функции Kotlin также приветствуется (например, распространение в ECMAScript).