Scala 的一个方便的特性是 lazy val
,其中对 val
的求值被延迟到必要时(在第一次访问时)。
当然,lazy val
必须有一些开销—— Scala 必须在某个地方跟踪值是否已经被求值,并且求值必须是同步的,因为多个线程可能会尝试在同一时间首次访问该值。
lazy val
的成本到底是多少? 是否有一个隐藏的布尔标志与 lazy val
相关联,以便跟踪它是否已经被评估,同步化的内容到底是什么,还有更多的成本吗?
此外,假设我这样做:
class Something {
lazy val (x, y) = { ... }
}
这是否等同于有两个独立的 lazy val
sx
和 y
,或者对于这对 (x, y)
,我只得到一次开销?