Делегат observable в Kotlin
Функция Delegates.observable из kotlin.properties
оборачивает var: при каждой успешной записи
вызывается лямбда с тремя аргументами - свойство,
старое и новое значение. Так отслеживают изменения
без ручного вызова обработчика в каждом сеттере.
import kotlin.properties.Delegates
class Account {
var balance: Int by Delegates.observable(0) {
_, old, new ->
println("$old -> $new")
}
}
fun main() {
val acc = Account()
acc.balance = 100
acc.balance = 150
}
Первый аргумент лямбды - KProperty; имя
свойства доступно как property.name, если
нужно общее сообщение для нескольких полей.
Функция observable срабатывает после присваивания.
Чтобы отменить недопустимое значение до записи,
в стандартной библиотеке есть vetoable -
в этом разделе достаточно observable.
Объявите class Label. Объявите в нём свойство
var text: String by Delegates.observable("") { _, _, new ->
println(new.length)
}. Присвойте свойству строки "ab"
и "abcd".
Объявите class Meter. Объявите свойство
var units: Int by Delegates.observable(0) { _, old, new ->
if (new < old) println("down")
}. Задайте units значения 10,
затем 5, затем 8. На экран должна
появиться одна строка down.