7 懒加载 lazy
惰性变量用法放在不可变变量之前;
只有在调用惰性变量时才会去实例化这个变量,类似于java中单例模式的懒汉模式;
作用:是将推迟复杂的计算,直到需要计算的时候才计算,而如果不使用,则完全不会进行计算。
//没有lazy关键字的时候
object LazyDemo {
def init():Unit = {
println("init")
}
def main(args: Array[String]): Unit = {
val p = init()
println("init after")
println(p)
println(p)
}
}
// ---输出结果---
init
init after
()
()
// 带有lazy关键字的变量
object LazyDemo2{
def init():Unit = {
println("init")
}
def main(args: Array[String]): Unit = {
// 只有在使用该变量时,才初始化,而且只初始化一次
lazy val p = init()
println("init after")
println(p)
println(p)
}
}
// ---输出结果---
init after
init
()
()
通过反编译工具查看后发现
不带有 lazy 关键字:
**
**
带有lazy关键字
**
**
总结:
对于这样一个表达式: lazy val t:T = expr 无论expr是什么东西,字面量也好,方法调用也好。Scala的编译器都会把这个expr包在一个方法中,并且生成一个flag来决定只在它第一次被访问时才调用该方法。