Scala关键字lazy的理解和使用

  • 时间:
  • 浏览:0

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

在Java中,要实现延迟加载(懒加载),前要另一方手动实现。一般的做法是另一个多的:

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

使用lazy关键字修饰变量后,只能在使用该变量时,才会调用真是例化方式 。也可是 说在定义property=initProperty()时不须会调用initProperty()方式 ,只能在底下的代码中使用变量property时才会调用initProperty()方式 。

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

Scala同样使用了Java中常用的懒加载的方式 自动帮助亲戚当当很久 们实现了延迟加载,很久 还加锁除理多个线程池池运行同時 调用初始化方式 是因为是因为的不一致什么的问题。

底下的property那末使用lazy关键字进行修饰,可是 property是立即实例化的,是因为观察线程池池运行的输出:

在声明property时,并那末立即调用实例化方式 intit(),可是 在使用property时,才会调用实例化方式 ,很久 无论缩少次调用,实例化方式 只会执行一次。

借鉴崔鹏飞的小结

并能发现,property声明时,立即进行实例化,调用了init()`实例化方式

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

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

惰性变量只能是不可变变量,很久 只能在调用惰性变量时,才会去实例化你这人变量。

观察输出:

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

而是因为使用lazy关键字进行修饰:

对于另一个多有一个多表达式: lazy val t:T = expr 无论expr是哪些地方东西,字面量也好,方式 调用也好。Scala的编译器总要把你这人expr包在有一个多方式 中,很久 生成有一个多flag来决定只在t第一次被访问时才调用该方式 。