scala 惰性赋值:lazy的使用
scala 里面的 lazy 一般是一个关键字,多用于放在一个变量的前面,表示这个变量是一个惰性变量。
在scala中,使用 lazy 关键字来实现延迟执行,如果使用了 lazy 定义某个变量,则这个变量只有在被使用时才会被执行初始化。
// 演示代码1
object lazyinitval{
def init():Int = {
println("init:::::")
0
}
val resource: Int = init()
def main(args: Array[String]):Unit = {
println("start::::")
println(resource)
println("end::::")
}
}
// 运行结果
init:::::
start::::
0
end::::
// 演示代码2
object lazyinitval{
def init():Int = {
println("init:::::")
0
}
val resource: Int = init()
def main(args: Array[String]):Unit = {
println("start::::")
println(resource)
println("end::::")
}
}
// 运行结果
start::::
init:::::
0
end::::
经过以上代码对比,lazy声明变量只有在使用的时候才能进行初始化,通过使用保护式来实现惰性值,但其具有额外的开销。
在一些情况中我们经常希望某些变量的初始化要延迟,并且表达式不会被重复计算。就像我们用Java实现一个懒汉式的单例。如:
- 打开一个数据库连接。这对于程序来说,执行该操作,代价式昂贵的,所以我们一般希望只有在使用其的引用时才初始化。(当然实际开发中用的是连接池技术)
- 为了缩短模块启动时间,可以将当前不需要的某些工作推迟执行。
- 保证对象中其他字段的初始化能优先执行。