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