Java8 lambda 是否像匿名 类 一样维护对其封闭实例的引用?
Do Java8 lambdas maintain a reference to their enclosing instance like anonymous classes?
We know 匿名 类 维护对其封闭实例的引用,这可能导致 Android 上的上下文泄漏。
由于 retrolambda 将 lambda 反向移植到 Java7,因此值得一试。
It seems Java8 lambdas 没有这个问题,但我找不到任何官方信息。
有线索吗?
这是一些信息。
来自以下 link http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html:
这对内存管理具有有益的意义:虽然内部 class 实例始终持有对其封闭实例的强引用,但不从封闭实例捕获成员的 lambda 不持有对其的引用。内部 class 个实例的这种特性通常是内存泄漏的来源(所谓的失效侦听器问题)
您还可以看到http://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html
从文本:
嵌套class:如果你的需求类似于局部class,你想让类型更广泛可用,并且你不需要访问局部变量或方法参数。
如果您需要访问封闭实例的非public 字段和方法,请使用非静态嵌套class(或内部class)。如果不需要此访问权限,请使用静态嵌套 class。
Lambda 表达式和方法引用仅在需要时捕获对 this
的引用,即当直接引用 this
或访问实例(非 static
)成员时。
当然,如果您的 lambda 表达式捕获局部变量的值并且该值包含对 this
的引用,则它也意味着引用 this
...
We know 匿名 类 维护对其封闭实例的引用,这可能导致 Android 上的上下文泄漏。
由于 retrolambda 将 lambda 反向移植到 Java7,因此值得一试。
It seems Java8 lambdas 没有这个问题,但我找不到任何官方信息。
有线索吗?
这是一些信息。
来自以下 link http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html: 这对内存管理具有有益的意义:虽然内部 class 实例始终持有对其封闭实例的强引用,但不从封闭实例捕获成员的 lambda 不持有对其的引用。内部 class 个实例的这种特性通常是内存泄漏的来源(所谓的失效侦听器问题)
您还可以看到http://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html 从文本: 嵌套class:如果你的需求类似于局部class,你想让类型更广泛可用,并且你不需要访问局部变量或方法参数。
如果您需要访问封闭实例的非public 字段和方法,请使用非静态嵌套class(或内部class)。如果不需要此访问权限,请使用静态嵌套 class。
Lambda 表达式和方法引用仅在需要时捕获对 this
的引用,即当直接引用 this
或访问实例(非 static
)成员时。
当然,如果您的 lambda 表达式捕获局部变量的值并且该值包含对 this
的引用,则它也意味着引用 this
...