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

09-延迟属性

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

9.3.1 延迟属性

lazy()是一个接收Lambda表达式作为参数并返回一个Lazy 实例的函数,返回的实例可以作为实现延迟属性的委托。也就是说,延迟属性第一次调用get()时,将会执行传递给lazy()函数的Lambda表达式并记录执行结果,后续所有对get()的调用只会返回记录的结果。

fun main(args: Array<String>) {
    println(lazyValue)     //第一次执行,执行两次输出表达式
    println(lazyValue)     //第二次执行,只输出返回值
}
val lazyValue: String by lazy {
    println("hello!")     //第一次调用输出,第二次调用不执行
    "Kotlin"
}

运行上面的代码,输出结果如下。

hello!
Kotlin
Kotlin

默认情况下,延迟属性的求值只在一个线程内执行,而且所有线程都将得到相同的值。如果委托的初始化函数不需要同步执行,那么多个线程可以同时执行初始化函数,此时可以将LazyThreadSafetyMode.PUBLICATION作为参数传递给lazy()函数。相反,如果确定初始化函数只能在单个线程中执行,那么可以使用LazyThreadSafetyMode.NONE模式,此模式不会带来任何资源开销,也不会带来任何线程安全问题。