Попытка написать функцию патча для классов данных в kotlin - PullRequest
0 голосов
/ 07 сентября 2018

Вот моя проблема.

Допустим, у нас есть data class User

data class User(var name: String? = null, var age: Int? = null)

И у нас есть 4 пользовательских объекта

val oldUser = User("user1", 10)
val newUser1 = User("user2", null)
val newUser2 = User(null, 60)
val newUser3 = User(null, null)

Я хочу написать функцию расширения patch, который принимает 2 User объектов (или любой другой класс данных) и возвращает другого пользователя, который создается путем применения патча для ненулевых полей второго User к первому.

, поэтому для вышеупомянутых объектовфункция исправления должна вести себя следующим образом -

oldUser.patch(newUser1) //returns User("user2", 10) (name is changed)
oldUser.patch(newUser2) //returns User("user1", 60) (age is changed)
oldUser.patch(newUser3) //returns User("user1", 10) (no change)

Решение, которое я мог бы найти до сих пор, включает отражение и модификацию приемника User.Вот код для этого.

inline fun <reified T : Any> T.patch(new: T): T {
    T::class.memberProperties
        .filterIsInstance<KMutableProperty<*>>().forEach { field ->
            field.getter.call(new)?.let { field.setter.call(this, it) }

        }
    return this
}

Как я могу написать универсальную функцию расширения, которая может достигать вышеуказанного поведения и не изменяет исходный объект?

...