Scala的关键字Lazy

Scala中使用关键字lazy来定义惰性变量,实现延迟加载(懒加载)。 
惰性变量只能是不可变变量 val,并且只有在调用惰性变量时,才会去实例化这个变量
。同理参考下 浏览大型网页时加载方式。

在Java中,要实现延迟加载(懒加载),需要自己手动实现。一般的做法是这样的:

public class JavaLazyDemo {
    private String name;

    //初始化姓名为huangbo
    private String initName(){
        return "huangbo";
    }

    public String getName(){
        //如果name为空,进行初始化
        if(name == null){
            name = initName();
        }
        return  name;
    }

}

在Scala中对延迟加载这一特性提供了语法级别的支持:

lazy val name = initName()

使用lazy关键字修饰变量后,只有在使用该变量时,才会调用其实例化方法。也就是说在定义property=initProperty()时并不会调用initProperty()方法,只有在后面的代码中使用变量property时才会调用initProperty()方法。

如果不使用lazy关键字对变量修饰,那么变量property是立即实例化的:

object ScalaLazyDemo {
  def init():String = {
    println("huangbo 666")
    return "huangbo"
  }

  def main(args: Array[String]): Unit = {
    val name = init();
    println("666")
    println(name)
  }
}

 

上面的property没有使用lazy关键字进行修饰,所以property是立即实例化的,调用了initName()方法进行实例化。

使用Lazy进行修饰

object ScalaLazyDemo {
  def init():String = {
    println("huangbo 666")
    return "huangbo"
  }

  def main(args: Array[String]): Unit = {
    lazy val name = init();
    println("666")
    println(name)
  }
}

不但是在调用函数时,加入lazy会导致函数的执行被推迟,我们在生命普通变量的时候,变量的分配也会被推迟。如下

posted @ 2019-10-24 21:25  sowhat1412  阅读(166)  评论(0编辑  收藏  举报