场景:有一些属性,在需要的时候才创建。并且只实现一次。
延迟属性:首次访问时计算
可观察属性:监听器收到有关此属性变量的通知
把多个属性存储在一个映射中。
语法: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
网友评论