通常、時間またはスペースが重要なアプリケーションでは、2 番目の方法を優先する必要があります。その理由はバイトコードに隠されています。具体的には、
abstract class Foo { def value: Int }
class Bar {
def out(i: => Int) = {
lazy val v0 = i
new Foo { def value = v0 }
}
def in(i: => Int) = new Foo {
private lazy val v0 = i
def value = v0
}
}
次に、2 番目のケースでは、private v0: Int
andbitmap$0: Boolean
をバイトコードに追加し、さらに標準の遅延 val アクセサーを追加します。ただし、最初のケースでは、代わりに av0$lzy$1: runtime.IntRef
と aを追加bitmap$0$1: runtime.VolatileByteRef
して、同等のものを参照し、メソッドの本体で作成されInt
ます。したがって、ラッピングの追加レイヤーがあります。Boolean
out
私のマシンでは、バージョンは、オブジェクトを作成して 1 回取得するout
のにバージョンよりも約 50% 長くかかります。in
value