web-dev-qa-db-ja.com

Java8ラムダは匿名クラスのようにそれらを囲むインスタンスへの参照を維持しますか?

わかっています 匿名クラスはそれを囲むインスタンスへの参照を維持し、これがAndroidでコンテキストリークにつながる可能性があることを知っています。

retrolambda ラムダをJava7にバックポートするので、試してみる価値があります。

どうやら Java8ラムダにはこの問題はないようですが、公式情報は見つかりません。

どんな手掛かり?

30
Renaud Cerrato

ここにいくつかの情報があります。

次のリンクから http://cr.openjdk.Java.net/~briangoetz/lambda/lambda-state-final.html :これはメモリ管理に有益な意味を持ちます:内部クラスインスタンスは常に囲んでいるインスタンスへの強い参照を保持します。囲んでいるインスタンスからメンバーをキャプチャしないラムダは、それへの参照を保持しません。内部クラスインスタンスのこの特性は、多くの場合、メモリリークの原因となる可能性があります(いわゆる失効したリスナーの問題)。

また、テキストから http://docs.Oracle.com/javase/tutorial/Java/javaOO/whentouse.html を確認できます。ネストされたクラス:要件が次の要件と類似している場合に使用します。ローカルクラスの場合、型をより広く利用できるようにしたいので、ローカル変数やメソッドパラメータにアクセスする必要はありません。

囲んでいるインスタンスの非パブリックフィールドおよびメソッドへのアクセスが必要な場合は、非静的ネストクラス(または内部クラス)を使用します。このアクセスを必要としない場合は、静的なネストされたクラスを使用してください。

17
Hamed Moghaddam

ラムダ式とメソッド参照は、必要な場合、つまりthisが直接参照されている場合、またはインスタンス(非this)メンバーがアクセスされている場合にのみ、staticへの参照をキャプチャします。

もちろん、ラムダ式がローカル変数の値をキャプチャし、その値にthisへの参照が含まれている場合、それはthisも参照することを意味します…

20
Holger