考虑常规 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) // ???
}
另外,假设def
和lazy 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
}
从性能的角度来看,我目前的假设是def
或val
(同一事物)的第一次访问之间基本没有区别,但后续访问已经评估的{ {1}}会更快(假设被评估的任何内容都非常大)。
因此,如果我有一个大型列表,我只需要评估一次,那么我应该使用val
(如果不确定它将被使用,并且第一次访问的性能不是问题我,然后val
一个?
答案 0 :(得分:3)
是的,一切都正确。在初始化方面,包对象的行为与普通对象相似。