Scala关键字lazy的理解和使用

  • 时间:
  • 浏览:1

借鉴崔鹏飞的小结

本文的编写借鉴了剥开Scala的糖衣(5) -- Lazy

有时候不使用lazy关键字对变量修饰,那末 变量property是立即实例化的:

并能 发现,property声明时,立即进行实例化,调用了init()`实例化法律法律措施

而在Scala中对延迟加载你这一价值形式提供了语法级别的支持:

在Java中,要实现延迟加载(懒加载),时要买车人手动实现。一般的做法是原来的:

比如常用的单例模式懒汉式实现时就使用了中间类事于的思路实现。

对于原来有一个表达式: lazy val t:T = expr 无论expr是哪此东西,字面量也好,法律法律措施调用也好。Scala的编译器时要把你这一expr包在有一个法律法律措施中,有时候生成有一个flag来决定只在t第一次被访问时才调用该法律法律措施。

在声明property时,并那末 立即调用实例化法律法律措施intit(),所以所以我在使用property时,才会调用实例化法律法律措施,有时候无论缩少次调用,实例化法律法律措施只会执行一次。

观察输出:

中间的property那末 使用lazy关键字进行修饰,所以所以property是立即实例化的,有时候观察守护进程的输出:

而有时候使用lazy关键字进行修饰:

使用lazy关键字修饰变量后,只能在使用该变量时,才会调用虽然例化法律法律措施。也所以所以我说在定义property=initProperty()时无须会调用initProperty()法律法律措施,只能在中间的代码中使用变量property时才会调用initProperty()法律法律措施。

Scala中使用关键字lazy来定义惰性变量,实现延迟加载(懒加载)。

惰性变量只能是不可变变量,有时候只能在调用惰性变量时,才会去实例化你这一变量。

与Java相比起来,实现懒加载虽然比较方便了。那末 Scala是怎么才能 才能 实现你这一语法糖的呢?反编译看下Scala生成的class:

Scala同样使用了Java中常用的懒加载的法律法律措施自动帮助亲戚亲戚朋友实现了延迟加载,有时候还加锁避免多个守护进程一同调用初始化法律法律措施有时候原困 的不一致问题图片。