expresiones - java 8 lambda explicacion
¿Mantiene Java8 lambdas una referencia a su instancia adjunta, como las clases anónimas? (2)
Sabemos que las clases anónimas mantienen una referencia a su instancia adjunta y que esto puede provocar filtraciones de contexto en Android.
Ya que retrolambda lambdas a Java7, podría valer la pena intentarlo.
Parece que las lambdas Java8 no tienen este problema, pero no puedo encontrar ninguna información oficial sobre eso.
¿Cualquier pista?
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 memoria: mientras que las instancias de clase interna siempre tienen una fuerte referencia a su inclusión Por ejemplo, las lambdas que no capturan miembros de la instancia adjunta no contienen una referencia a ella. Esta característica de las instancias de clase interna a menudo puede ser una fuente de pérdidas de memoria (el llamado problema del oyente caducado)
También puede ver http://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html desde el texto: Clase anidada: Úselo si sus requisitos son similares a los de una clase local, desea hacer el tipo más ampliamente disponible, y no requiere acceso a variables locales o parámetros de método.
Utilice una clase anidada no estática (o clase interna) si necesita acceder a los campos y métodos no públicos de una instancia envolvente. Use una clase anidada estática si no necesita este acceso.
Las expresiones de Lambda y las referencias de métodos capturan una referencia a this
solo si es necesario, es decir, cuando se hace referencia a esto directamente o se accede a un miembro de instancia (no static
).
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 ...