Я использую наблюдаемый шаблон для отслеживания изменений в объекте. Для этого я использовал сборку observable от Kotlin. У меня все работает нормально, но для отслеживания некоторых изменений мне приходится повторять один и тот же код для каждого атрибута. Это мой код:
class Employee(
id: String,
name: String,
surname: String,
age: Int,
salary: Int) {
val changes = HashMap<String, Pair<Any, Any>>()
val id = id //Id is immutable
var name: String by Delegates.observable(name) { prop, old, new ->
if (old != new) {
changes.put(prop.name, Pair(old, new))
println("${prop.name} has changed from $old to $new")
}
}
var surname: String by Delegates.observable(surname) { prop, old, new ->
if (old != new) {
changes.put(prop.name, Pair(old, new))
println("${prop.name} has changed from $old to $new")
}
}
var age: Int by Delegates.observable(age) { prop, old, new ->
if (old != new) {
changes.put(prop.name, Pair(old, new))
println("${prop.name} has changed from $old to $new")
}
}
var salary: Int by Delegates.observable(salary) { prop, old, new ->
if (old != new) {
changes.put(prop.name, Pair(old, new))
println("${prop.name} has changed from $old to $new")
}
}
}
Как видите, я повторяю эти строки кода для каждого атрибута:
by Delegates.observable(name) { prop, old, new ->
if (old != new) {
changes.put(prop.name, Pair(old, new))
println("${prop.name} has changed from $old to $new")
}
}
У кого-нибудь есть идея сделать этот код более СУХИМЫМ, чтобы мне не приходилось копировать и вставлять строки везде, я посмотрел онлайн, но не смог найти способ определить логику в другом месте и применить ее ко всем атрибуты в классе.