个人随笔
目录
Scala学习之路 (五)Scala的关键字Lazy
2019-12-12 23:01:23

转自:https://www.cnblogs.com/qingyunzong/p/8869761.html

Scala中使用关键字lazy来定义惰性变量,实现延迟加载(懒加载)。
惰性变量只能是不可变变量,并且只有在调用惰性变量时,才会去实例化这个变量。

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

  1. public class JavaLazyDemo {
  2. private String name;
  3. //初始化姓名为huangbo
  4. private String initName(){
  5. return "huangbo";
  6. }
  7. public String getName(){
  8. //如果name为空,进行初始化
  9. if(name == null){
  10. name = initName();
  11. }
  12. return name;
  13. }
  14. }

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

  1. lazy val name = initName()

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

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

  1. object ScalaLazyDemo {
  2. def init():String = {
  3. println("huangbo 666")
  4. return "huangbo"
  5. }
  6. def main(args: Array[String]): Unit = {
  7. val name = init();
  8. println("666")
  9. println(name)
  10. }
  11. }

运行结果:

  1. huangbo 666
  2. 666
  3. huangbo

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

使用Lazy进行修饰

  1. object ScalaLazyDemo {
  2. def init():String = {
  3. println("huangbo 666")
  4. return "huangbo"
  5. }
  6. def main(args: Array[String]): Unit = {
  7. lazy val name = init();
  8. println("666")
  9. println(name)
  10. }
  11. }

运行结果:

  1. 666
  2. huangbo 666
  3. huangbo

在声明name时,并没有立即调用实例化方法initName(),而是在使用name时,才会调用实例化方法,并且无论缩少次调用,实例化方法只会执行一次。

 192

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2