2016-03-28 9 views
6

A differenza delle classi interne anonime, Java 8 lambda non mantiene i riferimenti alla classe di inclusione (genitore). Android N adds support per lambda.Do lambda nel compilatore di Android N jack contiene i riferimenti alla classe di inclusione?

Tuttavia, sono implementati nel compilatore Jack utilizzando classi interne anonime per compatibilità con le versioni precedenti, come indicato dalla nota negli stati del collegamento.

Ciò significa che lambda in classi Android compilate utilizzando Jack (e non retrolambda) manterrà i riferimenti alla classe di chiusura?

So che uno dei motivi molte persone erano entusiasti lambda è quella di evitare Fragment o Activity perdite quando li utilizzano, ma ad uno sguardo superficiale, sembra che usando jack compilatore non darà quel beneficio.

+1

Possibile duplicato di [Do Java8 lambdas conserva un riferimento all'istanza che li include come classi anonime?] (Http://stackoverflow.com/questions/28446626/do-java8-lambdas-maintain-a-reference-to-the-their -enclosing-instance-like-anonymous) –

+1

@AndreClassen, quella domanda non copre Jack, ma hai ragione, potrebbe essere un dupe se retrolambda decompila anche lambda alle classi interne anonime a livello bytecode. –

+0

Btw, la tua ipotesi che Java 8 lambda non abbia mai un riferimento all'istanza acclusa è sbagliata - ovviamente lo fanno se devono catturare le variabili di istanza. –

risposta

5

Penso che la frase "classe anonima" non debba essere interpretata troppo alla lettera. A mio avviso, l'unica cosa che vogliono dirci è che Jack genera le classi in fase di compilazione (a differenza dell'approccio runtime di Java 8).

Dal codice JackIrBuilder direi che l'IR generato sembra molto simile al bytecode che verrebbe generato da retrolambda.

Jack sembra creare un metodo sintetico contenente il corpo lambda nel tipo racchiudente e passa il riferimento dell'istanza acclusa al costruttore della classe generato solo nei casi in cui è necessario, cioè quando i membri dell'istanza acclusa sono catturato.

Riferimento: https://android.googlesource.com/toolchain/jack/+/0af676c4779c5b55fb321f491811516f3d74ed93/jack/src/com/android/jack/ir/impl/JackIrBuilder.java

Quindi, da quanto ho capito, la risposta è: solo quando qualcosa deve essere catturato dall'istanza racchiude.

Problemi correlati