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) // ???
}
此外,假定第一次访问时,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
(同样的事情),但随后的访问已经评价val
的速度会更快的首次访问之间没有差别(假设被评估的东西是可测量的大)。因此,如果我有一个大型列表,我只需要评估一次,那么我应该使用val
(如果不确定它会被使用,并且第一次访问的性能对我来说不是问题,那么一个lazy
一)?
欢呼声以供确认。 – Nio