2016-08-23 2 views
1

考えてみよう普通vallazy) - 正確に評価されるのはいつですか?値は正確に評価されるのはいつですか?

クラスとシングルトンオブジェクトについては、これはクラス/オブジェクトがインスタンス化されるときと考えられます。また、特性については、その特性を実装するクラスがインスタンス化されるとき。パッケージオブジェクトについては、わかりません。

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 
} 

パフォーマンスの観点からは、私の現在の仮定は((同じものの)defまたはvalの最初のアクセスの間に違いは基本的に存在しないことですが、すでに評価さvalが速くなりのその後のアクセス評価されているものが大規模であると仮定して)。

したがって、私が一度だけ評価する必要がある大きなリストがある場合は、valを使用する必要があります(もしそれが使用されることが確実でない場合、最初のアクセスのパフォーマンスは私にとって問題ではありません。 a lazy)?

答えて

3

はい、すべて正しくなりました。パッケージオブジェクトは、初期化に関して通常のオブジェクトのように動作します。

+0

確認のための歓声。 – Nio

関連する問題