scala 惰性赋值

Posted by 果然 on January 6, 2022

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实现一个懒汉式的单例。如:

  • 打开一个数据库连接。这对于程序来说,执行该操作,代价式昂贵的,所以我们一般希望只有在使用其的引用时才初始化。(当然实际开发中用的是连接池技术)
  • 为了缩短模块启动时间,可以将当前不需要的某些工作推迟执行。
  • 保证对象中其他字段的初始化能优先执行。

参考资料

  1. Scala惰性赋值:lazy的使用