ラムダ対Javaのダブルブレースの初期化

everett1992:

あなたは「javaのダブルブレース」を検索する場合は、それを使用して強いの引数を見つけることができます。

たびに誰かが子猫を殺され、ダブルブレースの初期化を使用しています。https://stackoverflow.com/a/27521360/555631

引数はあなたがあまりにも多くの匿名クラスを作成しているし、あなたが潜在的にメモリリークを作成しています。

ラムダは何が違うのか?彼らはそれぞれ彼ら各参照自分を囲む閉鎖、匿名の内部クラスを作成します。

rgettman:

ラムダ式は、機能的なインターフェイスを実装するために起こる匿名内部クラスとは異なります。

匿名内部クラスは通常、コンパイル時の線に沿って何か自分のクラスファイルを作成します。Foo$1.classそれがに記載された場合は、をFooクラス。これは、インターフェイスまたはサブクラスクラスを実装し、完全に機能するクラスです。その範囲外のローカル値を参照するには、それは、舞台裏で表し、匿名の内部クラスのインスタンス変数を作成しますコピー値のを。変数が効果的に最終的でなければならない理由はここにある-そうでない場合は、実際の変数が変更される可能性があり、コピーが古くなっているかもしれません。

ラムダ式は、匿名内部クラスを作成しないでください。彼らは、使用java.lang.invoke.LambdaMetafactory生成するCallSiteラムダ式を実行するために、後で使用できるように。ラムダ式は、それがブロックまたは式だかどうか、それが含まれていているクラス内の隠されたプライベート静的メソッドに変換されます。代わりに隠れ変数を持つクラスを作成するのではなく、撮影した値は、隠されたプライベート静的メソッドのパラメータに変換されます。メソッドに渡された値が再びコピーであるため、ローカル値がまだ効果的に最終でなければなりません。この方法は、によって呼び出されますinvokedynamicJVMの命令。

出典:

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=236614&siteId=1