委托属性

场景:有一些属性,在需要的时候才创建。并且只实现一次。
延迟属性:首次访问时计算
可观察属性:监听器收到有关此属性变量的通知
把多个属性存储在一个映射中。
语法:val/var <属性名>:<类型>by<表达式>
属性的委托需要提供getValue和setValue

class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        println("测试-getValue")
        return "$thisRef, thank you for delegating '${property.name}' to me!"
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$value has been assigned to '${property.name}' in $thisRef.")
    }
}

声明和使用(只有在使用的时候才会实现委托):

var p: String by Delegate()
println("测试-${p}")

注意:在debug中虽然没有使用p,但是会走委托的实现但是捕获不到断点(就算你在getValue中打断点,它确实走了这个方法,log中也打印了,但是就是断点不到它的执行过程)。

延迟属性 Lazy
默认lazy属性的求值是同步锁(synchronized)是最安全的
LazyThreadSafetyMode.PUBLICATION:不需要同步锁
LazyThreadSafetyMode.NONE:线程不安全

    val lazyValue: String by lazy{
        println("测试-go")
        "测试-hello"
    }

执行:第一次会唱诶lazy()并记录结果,第二次会直接返回记录结果

        println(lazyValue)
        println(lazyValue)

latent var
让编译期忽略对属性未初始化的检查,后续在哪里以及何时初始化开发者决定,比by lazy代价小点
lateinit var 是否初始化(1.2起)使用 .isInitialized

你可能感兴趣的:(委托属性)