2015-02-11 16 views
25

We know che le classi anonime mantengano un riferimento alla loro istanza allegata e che ciò possa portare a perdite di contesto su Android.I Java lambda mantengono un riferimento alla loro istanza che li include come classi anonime?

Dal retrolambda backport lambda a Java7, potrebbe valere la pena provare.

It seems che Java8 lambda non ha questo problema, ma non riesco a trovare alcuna informazione ufficiale su questo.

Qualsiasi indizio?

+1

stai chiedendo circa lambda regolari o il bytecode prodotto da Retrolambda? Se stai chiedendo informazioni sui lambda regolari, che cosa ha a che fare Retrolambda con la domanda? – Radiodef

+0

Dalla mia comprensione, retrolambda usa Java8 per produrre bytecode, e la risposta potrebbe essere valida per entrambi. –

risposta

14

Ecco alcune informazioni.

dal seguente link http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html: Questo ha un risvolto benefico per la gestione della memoria: mentre le istanze di classe interni tengono sempre un forte riferimento alla loro istanza allegando, lambda che non catturano membri dall'istanza che racchiude non tenere un riferimento alla esso. Questa caratteristica di istanze di classi interne spesso può essere una fonte di perdite di memoria (il cosiddetto problema ascoltatore decaduta)

È anche possibile vedere http://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html dal testo: classe annidata: Usalo se le vostre esigenze sono simili a quelli di una classe locale, si desidera rendere il tipo più ampiamente disponibile e non è necessario accedere alle variabili locali o ai parametri del metodo.

Utilizzare una classe nidificata non statica (o classe interna) se è necessario accedere ai campi e ai metodi non pubblici di un'istanza di inclusione. Utilizzare una classe nidificata statica se non si richiede questo accesso.

16

espressioni lambda e metodo riferimenti catturare un riferimento this solo se necessario, cioè quando viene fatto riferimento this direttamente o un'istanza (non static) membro si accede.

Naturalmente, se l'espressione lambda coglie il valore di una variabile locale e che il valore contiene un riferimento a this implica riferimento this così ...

+0

Esattamente i miei pensieri. Qualche riferimento? –

+2

Puoi leggere [questo documento §7] (http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html) e [questa risposta] (http://stackoverflow.com/ a/27524543/2711488) seguendo i collegamenti ... – Holger

+0

Questa è la mia risposta. Puoi modificare il tuo post per includerlo? –