2015-02-11 5 views
25

We know dass anonyme Klassen einen Verweis auf ihre umschließende Instanz beibehalten und dass dies zu Kontextlecks auf Android führen kann.Behalten Java8-Lambdas wie anonyme Klassen einen Verweis auf ihre umschließende Instanz?

Seit retrolambda Backports lambdas zu Java7, könnte es einen Versuch wert sein.

It seems dass Java8 Lambdas dieses Problem nicht haben, aber ich kann keine offiziellen Informationen darüber finden.

Irgendwelche Hinweise?

+1

Sind Sie fragen über reguläre lambdas oder durch Retrolambda erzeugt Bytecode? Wenn Sie nach normalen Lambdas fragen, was hat Retrallambda mit der Frage zu tun? – Radiodef

+0

Aus meiner Sicht verwenden RetroLamba Java8, um Bytecode zu erzeugen, und die Antwort kann für beide gültig sein. –

Antwort

14

Hier sind einige Informationen.

auf dem folgenden Link http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html: Dies hat eine positive Auswirkung für die Speicherverwaltung: Während innere Klasseninstanzen immer einen starken Bezug auf ihre umgebende Instanz halten, Lambda-Ausdrücke, die keine Mitglieder aus der umschließenden Instanz erfaßt nicht halten einen Verweis auf es. Diese Eigenschaft der inneren Klasseninstanzen können oft eine Quelle von Speicherlecks (die so genannte verstrichene Zuhörer Problem) sein

Sie auch http://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html aus dem Text sehen: Verschachtelte Klasse: Verwenden Sie es, wenn Ihre Anforderungen sind ähnlich denen einer lokalen Klasse möchten Sie den Typ breiter verfügbar machen und benötigen keinen Zugriff auf lokale Variablen oder Methodenparameter.

Verwenden Sie eine nicht statische geschachtelte Klasse (oder innere Klasse), wenn Sie Zugriff auf die nicht öffentlichen Felder und Methoden einer umschließenden Instanz benötigen. Verwenden Sie eine statische geschachtelte Klasse, wenn Sie diesen Zugriff nicht benötigen.

16

Lambda-Ausdrücke und Verfahren Referenzen erfassen einen Verweis auf this nur bei Bedarf, das heißt, wenn this direkt Bezug genommen wird, oder eine Instanz (nicht static) Element zugegriffen wird.

Natürlich, wenn Ihr Lambda-Ausdruck den Wert einer lokalen Variablen erfasst und dieser Wert enthält einen Verweis auf this es Referenzierung impliziert this auch ...

+0

Genau meine Gedanken. Irgendeine Referenz? –

+2

Sie können lesen [dieses Dokument §7] (http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html) und [diese Antwort] (http://stackoverflow.com/ a/27524543/2711488) den Links folgen ... – Holger

+0

Das ist meine Antwort. Können Sie Ihren Beitrag so bearbeiten, dass er diesen enthält? –