¿Java8 lambdas mantiene una referencia a su instancia de inclusión como clases anónimas?


Sabemos que las clases anónimas mantienen una referencia a su instancia de inclusión y que esto puede conducir a fugas de contexto en Android.

Dado que retrolambda retroporta lambdas a Java7, podría valer la pena intentarlo.

Parece que Java8 lambdas no tiene este problema, pero no puedo encontrar ninguna información oficial al respecto.

¿Alguna pista?
Author: Community, 2015-02-11

2 answers

Aquí hay algo de información.

Desde el siguiente enlace http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html: Esto tiene una implicación beneficiosa para la gestión de la memoria: mientras que las instancias de clase interna siempre tienen una referencia fuerte a su instancia que encierra, las lambdas que no capturan miembros de la instancia que encierra no tienen una referencia a ella. Esta característica de las instancias de clase interna a menudo puede ser una fuente de fugas de memoria (el llamado oyente caducado problema)

También puedes ver http://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html del texto: Clase anidada: Úselo si sus requisitos son similares a los de una clase local, desea que el tipo esté más disponible y no requiere acceso a variables locales o parámetros de método.

Utilice una clase anidada no estática (o una clase interna) si necesita acceso a los campos y métodos no públicos de una instancia adjunta. Utilice una clase anidada estática si no requiere este acceso.

 15
Author: Hamed Moghaddam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-08 10:28:39

Las expresiones Lambda y las referencias de métodos capturan una referencia a this solo si es necesario, es decir, cuando se hace referencia a this directamente o se accede a un miembro de instancia (que no esstatic).

Por supuesto, si su expresión lambda captura el valor de una variable local y ese valor contiene una referencia a this implica hacer referencia a this también {

 16
Author: Holger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-11 08:44:37