2016-08-23 90 views
1

考虑常规val s(而不是lazy ones) - 他们什么时候准确评估?什么时候val值准确评估?

对于类和单例对象,我相信这是当类/对象被实例化时。对于特质,当实现所述特征的类被实例化时。对于包对象,我不确定。

class Test { 
    val someList = (1 to 1000) // evaluated when it's Test is instantiated 
} 

object Test { 
    val someList = (1 to 1000) // evaluated when Test gets instantiated 
} 

trait Test { 
    val someList = (1 to 1000) // evaluated when a class implementing Test is instantiated 
} 

package object Test { 
    val someList = (1 to 1000) // ??? 
} 

此外,假定第一次访问时,deflazy val都评价,是该val只计算一次他们之间的唯一的主要区别?

class Test { 
    lazy val someList = (1 to 1000) // evaluated at access time, once 
    def someList = (1 to 1000) // evaluated at access time for each access 
} 

从性能的角度来看,我目前的假设是有本质上是一个defval(同样的事情),但随后的访问已经评价val的速度会更快的首次访问之间没有差别(假设被评估的东西是可测量的大)。因此,如果我有一个大型列表,我只需要评估一次,那么我应该使用val(如果不确定它会被使用,并且第一次访问的性能对我来说不是问题,那么一个lazy一)?

回答

3

是的,一切正确。包对象在初始化方面的行为与普通对象相似。

+0

欢呼声以供确认。 – Nio