09-延迟属性
9.3.1 延迟属性
lazy()是一个接收Lambda表达式作为参数并返回一个Lazy
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模式,此模式不会带来任何资源开销,也不会带来任何线程安全问题。