2016-08-23 91 views
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) // ??? 
} 

此外,假定第一次訪問時,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(同樣的事情),但隨後的訪問已經評價val的速度會更快的首次訪問之間沒有差別(假設被評估的東西是可測量的大)。因此,如果我有一個大型列表,我只需要評估一次,那麼我應該使用val(如果不確定它會被使用,並且第一次訪問的性能對我來說不是問題,那麼一個lazy一)?

回答

3

是的,一切正確。包對象在初始化方面的行爲與普通對象相似。

+0

歡呼聲以供確認。 – Nio