什么时候对val进行精确评估?

时间:2016-08-23 12:29:31

标签: scala

考虑常规 val s(不是lazy个) - 它们何时被评估?

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

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(同一事物)的第一次访问之间基本没有区别,但后续访问已经评估的{ {1}}会更快(假设被评估的任何内容都非常大)。

因此,如果我有一个大型列表,我只需要评估一次,那么我应该使用val(如果不确定它将被使用,并且第一次访问的性能不是问题我,然后val一个?

1 个答案:

答案 0 :(得分:3)

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