13-局部委托属性
9.3.5 局部委托属性
自1.1版本开始,Kotlin允许将局部变量声明为委托属性。例如,局部变量惰性初始化。
fun main(args: Array<String>) {
example({Foo()})
}
fun example(cf: () -> Foo) {
val p: Int by lazy {
println("first in")
0
}
println(p)
println(cf().visiable())
println("-------------")
val h by lazy(cf)
if (true) {
println("type h is $h")
println(h.visiable())
}
}
class Foo {
fun visiable(): Boolean {
return true
}
}
对于每个委托属性来说,Kotlin编译器都会生成辅助属性并委托给它。例如,对于属性prop,编译器生成的隐藏属性为prop$delegate,而访问器只是简单地将该属性委托给这个附加属性。
class C {
var prop: Type by MyDelegate()
}
//此段代码是由Kotlin编译器生成的
class C {
private val prop$delegate = MyDelegate()
var prop: Type
get() = prop$delegate.getValue(this, this::prop)
set(value: Type) = prop$delegate.setValue(this, this::prop, value)
}
从Kotlin编译器生成的代码可知prop属性的所有信息,参数this引用的是外部类C的实例,而this::prop则是KProperty类型的反射对象,是对该prop对象的自身描述。