Попытка написать функцию патча для классов данных в kotlin
Здесь моя проблема.
Допустим, у нас есть 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
}
Как я могу написать универсальную функцию расширения, которая может достигать вышеуказанного поведения и не изменяет исходный объект?