通常、時間またはスペースが重要なアプリケーションでは、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: Intandbitmap$0: Booleanをバイトコードに追加し、さらに標準の遅延 val アクセサーを追加します。ただし、最初のケースでは、代わりに av0$lzy$1: runtime.IntRefと aを追加bitmap$0$1: runtime.VolatileByteRefして、同等のものを参照し、メソッドの本体で作成されIntます。したがって、ラッピングの追加レイヤーがあります。Booleanout
私のマシンでは、バージョンは、オブジェクトを作成して 1 回取得するoutのにバージョンよりも約 50% 長くかかります。invalue