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

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对象的自身描述。