Scala惰性赋值:lazy的使用

来源:互联网 发布:磁力链接转换软件 编辑:程序博客网 时间:2024/05/17 23:00

在一些情况中我们经常希望某些变量的初始化要延迟,并且表达式不会被重复计算。就像我们用Java实现一个懒汉式的单例。如:

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

在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:::0end:::
演示代码2:object lazyinitval {  def init(): Int = {    println("init::::::")    0  }  lazy val resource:Int = init()  def main(args: Array[String]): Unit = {    println("start:::")    println(resource)    println("end:::")  }}运行结果:start:::init::::::0end:::

经过上述代码即运行结果对比,可以证明,使用lazy声明的变量只有在使用的时候才会进行初始化。在Scala中,通过使用保护式来实现惰性值。当客户代码引用了惰性值时,保护式会拦截引用并检查此时是否需要初始化惰性。由于保护式能够确保惰性在第一次访问之前便已初始化,因此增加保护式检查只有当第一次引用惰性值时才是必要的。
由于,保护式一直会检查惰性值是否已经初始化,所以惰性值与“立刻”值相比,其具有额外的开销。所以我们需要考虑惰性值的使用情况。只有当保护式带来的额外开销小于初始化带来的开销时,或者将某些值惰性化能简化系统初始化过程并确保执行顺序满足条件时,我们才应该使用惰性值。

0 0