当前位置:嗨网首页>书籍在线阅读

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