考えてみよう普通val
(lazy
) - 正確に評価されるのはいつですか?値は正確に評価されるのはいつですか?
クラスとシングルトンオブジェクトについては、これはクラス/オブジェクトがインスタンス化されるときと考えられます。また、特性については、その特性を実装するクラスがインスタンス化されるとき。パッケージオブジェクトについては、わかりません。
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
を使用する必要があります(もしそれが使用されることが確実でない場合、最初のアクセスのパフォーマンスは私にとって問題ではありません。 a lazy
)?
確認のための歓声。 – Nio