scala的lazy关键字的使用和理解
变量的初始化延迟,表达式不会被重复计算。就像java中实现懒汉式的单例
在Scala中,使用lazy关键字来实现延迟执行,如果使用了lazy定义某一个变量,则这个变量只有在被使用时才会执行初始化
1.不使用懒值定义---立即实例化
object TestLazy {
def init() : Int = {
println("init ::::")
0
}
//不使用懒值定义 立即实例化
val resource :Int = init()
def main(args: Array[String]): Unit = {
/* //val b = 10/1
lazy val a= 10/10
print(a)*/
println("start-----------")
println(resource)
println("end-------------")
}
}
执行结果
init ::::
start-----------
0
end-------------
2.使用lazy定义变量---使用时才初始化
/**
* @author star
*使用lazy关键字修饰变量后,只有在使用该变量时,才会调用其实例化方法
*/
object TestLazy2 {
def init() : Int = {
println("init ::::")
0
}
//懒值定义变量 ,使用时才实例化
lazy val resource :Int = init()
def main(args: Array[String]): Unit = {
/* //val b = 10/1
lazy val a= 10/10
print(a)*/
println("start-----------")
println(resource) //使用时才初始化
println("end-------------")
}
}
执行结果
start-----------
init ::::
0
end-------------
使用lazy声明的变量只有在使用的时候才会进行初始化。在Scala中,通过使用保护式来实现惰性值。当客户代码引用了惰性值时,保护式会拦截引用并检查此时是否需要初始化惰性。由于保护式能够确保惰性在第一次访问之前便已初始化,因此增加保护式检查只有当第一次引用惰性值时才是必要的。由于,保护式一直会检查惰性值是否已经初始化,所以惰性值与“立刻”值相比,其具有额外的开销。所以我们需要考虑惰性值的使用情况。只有当保护式带来的额外开销小于初始化带来的开销时,或者将某些值惰性化能简化系统初始化过程并确保执行顺序满足条件时,我们才应该使用惰性值