Kotlin - Есть ли способ передать значения свойств другому объекту со свойствами с таким же именем? - PullRequest
1 голос
/ 27 февраля 2020

Есть ли способ передать значения свойств другому объекту со свойствами с тем же именем, чтобы избежать повторного кода?

Например, избегать использования класса CepReceiptsInfo, отличного от value но они разделяют некоторые свойства name и type:

   val cepReceiptsInfo = CepRecepitsInfo()
    cepReceiptsInfo.operationTimestamp = value.operationTimestamp
    cepReceiptsInfo.sentDate = value.sentDate
    cepReceiptsInfo.sentTime = value.sentTime
    cepReceiptsInfo.concept = value.concept
    cepReceiptsInfo.referenceNumber = value.referenceNumber
    cepReceiptsInfo.amount = value.amount
    cepReceiptsInfo.trackingKey = value.trackingKey
    cepReceiptsInfo.bankTarget = value.bankTarget
    cepReceiptsInfo.bankSource = value.bankSource
    cepReceiptsInfo.sourceClienteName = value.sourceClienteName
    cepReceiptsInfo.beneficiaryName = value.beneficiaryName
    cepReceiptsInfo.accountNumberTarget = value.accountNumberTarget
    cepReceiptsInfo.term = value.term
    cepReceiptsInfo.authorizationNumber = value.authorizationNumber
    cepReceiptsInfo.linkCep = value.linkCep
    cepReceiptsInfo.status = value.status
    cepReceiptsInfo.bankSourceRefund = value.bankSourceRefund
    cepReceiptsInfo.causeRefund = value.causeRefund
    cepReceiptsInfo.accountTargetRefund = value.accountTargetRefund
    cepReceiptsInfo.currency = value.currency
    cepReceiptsInfo.accountNumberSource = value.accountNumberSource
    cepReceiptsInfo.accountTypeSource = value.accountTypeSource
    cepReceiptsInfo.accountTypeTarget = value.accountTypeTarget
    cepReceiptsInfo.indicatorRefund = value.indicatorRefund
    cepReceiptsInfo.amountIntRefund = value.amountIntRefund
    cepReceiptsInfo.operationRefundTimestamp = value.operationRefundTimestamp
    cepReceiptsInfo.dateMovement = value.dateMovement
    cepReceiptsInfo.timeMovement = value.timeMovement
    cepReceiptsInfo.dateRefund = value.dateRefund
    cepReceiptsInfo.timeRefund = value.timeRefund

на что-то вроде fe:

val cepReceiptsInfo = CepReceintsInfo()
cepReceiptsInfo.assignFrom(value)

оба класса классы данных .

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020

Как говорит Tenfour04, язык не предоставляет прямого способа сделать это, поэтому вы ограничены использованием дополнительных инструментов времени компиляции или Reflection во время выполнения.

Так как это довольно распространенное явление проблема, есть библиотека Java с именем ModelMapper , которая делает это за вас; и, как и со всеми Java библиотеками, вы можете использовать его и в Kotlin.

(я использовал его иногда. Это может избежать множества шаблонов. Хотя я не нашел его как рефакторинг безопасен, как утверждает первая страница ... Он также «скрывает» ссылки на поля таким образом, что IDE не будут отслеживать. Поэтому это не идеальное решение.)

2 голосов
/ 27 февраля 2020

Я не знаю пути без отражения.

fun Any.assignFrom(other: Any) {
    val thisProperties = this::class.memberProperties
        .filterIsInstance<KMutableProperty<*>>()
        .map { it.name to it }
        .toMap()
    for (property in other::class.memberProperties){
        thisProperties[property.name]?.setter?.call(this, property.getter.call(other))
    }
}
...