10-可观察属性
9.3.2 可观察属性
所谓可观察属性(observable),就是当属性发生变化时能自动拦截其变化,实现观察属性值变化的委托函数是Delegates.observable()。该函数接受两个参数:初始值和属性值变化事件的响应器(handler)。每当给属性赋值时都会调用该响应器,该响应器主要有3个参数:被赋值的属性、赋值前的旧属性值和赋值后的新属性值。
fun main(args: Array<String>) {
val user = User()
user.name = "first"
user.name = "second"
}
class User {
var name: String by Delegates.observable("初始值") {
prop, old, new ->
println("旧值:$old"+" "+"新值:$new")
}
}
运行上面的代码,输出结果如下。
旧值:初始值 新值:first
旧值:first 新值:second
如果想要截获一个赋值并“否决”它,那么可以使用vetoable函数,而不是observable函数。vetoable函数的响应器会返回一个布尔类型的结果,如果返回为true,则表示允许给属性赋值;如果返回为false,就会拒绝给属性赋值。
fun main(args: Array<String>) {
val user = User()
user.name = "first"
println(user.name)
user.name = "second"
println(user.name)
}
class User {
var name: String by Delegates.vetoable("初始值") {
prop, old, new ->
println("旧值:$old"+" "+"新值:$new")
var result=true
if (new.equals("second")){
result=false
println("否决赋值操作")
}
result
}
}
运行上面的代码,输出结果如下。
旧值:初始值 新值:first
first
旧值:first 新值:second
否决赋值操作
first