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