Scala关键字lazy的理解和使用

  • 时间:
  • 浏览:1
  • 来源:大发彩神8下载最新版—大发快三官网大发彩神

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

对于从前一个多多 表达式: lazy val t:T = expr 无论expr是哪几种东西,字面量也好,法律依据调用也好。Scala的编译器总要把你这个 expr包在一个多多 法律依据中,而且生成一个多多 flag来决定只在t第一次被访问时才调用该法律依据。

借鉴崔鹏飞的小结

都可不都后能 够发现,property声明时,立即进行实例化,调用了init()`实例化法律依据

而原因分析分析使用lazy关键字进行修饰:

使用lazy关键字修饰变量后,必须在使用该变量时,才会调用我我嘴笨 例化法律依据。也所以说在定义property=initProperty()时并非会调用initProperty()法律依据,必须在底下的代码中使用变量property时才会调用initProperty()法律依据。

比如常用的单例模式懒汉式实现时就使用了底下你这个的思路实现。

观察输出:

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

底下的property那末 使用lazy关键字进行修饰,所以property是立即实例化的,原因分析分析观察进程的输出:

原因分析分析不使用lazy关键字对变量修饰,那末 变量property是立即实例化的:

Scala同样使用了Java中常用的懒加载的法律依据自动帮助我门 实现了延迟加载,而且还加锁除理多个进程同时调用初始化法律依据原因分析分析原因分析分析的不一致现象。

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

在Java中,要实现延迟加载(懒加载),还要此人 手动实现。一般的做法是从前的:

而在Scala中对延迟加载你这个 底部形态提供了语法级别的支持:

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

惰性变量必须是不可变变量,而且必须在调用惰性变量时,才会去实例化你这个 变量。