2016-03-28 3 views
6

匿名の内部クラスとは異なり、Java 8のラムダは、囲む(親)クラスへの参照を保持しません。ラムダ用Android N adds supportAndroid N jackコンパイラのlambdaは、囲むクラスへの参照を保持していますか?

しかし、彼らはリンク状態でのノートとして、下位互換性のために匿名内部クラスを使用してJackコンパイラに実装されています。

これはAndroidのクラスでラムダは、ジャック(とないretrolambda)を使用してコンパイルすることを意味していますが囲んでいるクラスへの参照を保持しますか?

私は多くの人々がラムダ興奮した一つの理由は、それらを使用する場合FragmentまたはActivity漏洩を避けるためですが、チラッと見では、それがその恩恵を与えることはありませんjackコンパイラを使用してのように見えることを知っています。

+1

[Java8のlambdaは、匿名クラスのようなその囲むインスタンスへの参照を保持していますか?](http://stackoverflow.com/questions/28446626/do-java8-lambdas-maintain-a-reference-to-their -enclosingインスタンス様匿名) –

+1

@AndreClassenは、その質問には、ジャックをカバーしていませんが、retrolambdaもバイトコードレベルで匿名内部クラスにラムダを逆コンパイル場合あなたは正しい、それはだまされやすい人である可能性があります。 –

+0

Btw、Java 8のラムダが囲むインスタンスへの参照を保持しないという仮定は間違っています。もちろん、インスタンス変数を取得する必要がある場合はもちろんです。私はほとんどがクリアされ、メモリリークが発生しない場合の断片や活動への参照を保持する匿名の内部クラスリスナーを作成するアンドロイドパラダイムを考えていたので、 –

答えて

5

私は句「匿名クラスは」ここでも文字通りに解釈すべきではないと思います。ジャックがコンパイル時に(Java 8のランタイム・アプローチとは対照的に)クラスを生成するということだけを私が理解しておきたいと思っています。

JackIrBuilderコードから私は、生成されたIRはretrolambdaによって生成されるバイトコードと非常によく似ていますことを推測すると思います。

ジャックは囲みタイプのラムダボディを含む合成メソッドを作成し、囲むインスタンスの参照を生成されたクラスのコンストラクタに渡します。必要な場合、つまり囲むインスタンスのメンバーが捕らえられた

リファレンス:https://android.googlesource.com/toolchain/jack/+/0af676c4779c5b55fb321f491811516f3d74ed93/jack/src/com/android/jack/ir/impl/JackIrBuilder.java

だから、私が理解から、答えは:何かが親インスタンスからキャプチャする必要がある場合のみです。

関連する問題