Я хочу перетворити / зіставити деякі об'єкти класу "data" у подібні об'єкти класу "data". Наприклад, класи для веб-форми до класів для записів бази даних.
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, коли робимо ці класи / поля відкритими, але ми повинні реалізувати функції класу "data" вручну. (пор. приклади ModelMapper: https://github.com/jhalterman/modelmapper/blob/master/examples/src/main/java/org/modelmapper/gettingstarted/GettingStartedExample.java )
Як зіставити такі об'єкти "даних" у Котліні?
Оновлення: ModelMapper автоматично зіставляє поля, що мають однакові назви (наприклад, tel -> tel), без оголошень зіставлення. Я хочу зробити це з класом даних Kotlin.
Оновлення: мета кожного класу залежить від того, який тип програми, але вони, ймовірно, розміщені в іншому рівні програми.
Наприклад:
- дані з бази даних (сутність бази даних) до даних для форми HTML (модель / модель перегляду)
- Результат REST API до даних для бази даних
Ці класи схожі, але не однакові.
Я хочу уникати звичайних викликів функцій з цих причин:
- Це залежить від порядку аргументів. Функція для класу з багатьма полями одного типу (наприклад, String) буде легко порушена.
- Багато декларацій є необхідними, хоча більшість відображень можна вирішити за домовленістю.
Звичайно, призначена бібліотека, яка має подібну функцію, але інформація про функцію Kotlin також вітається (наприклад, розповсюдження в ECMAScript).