Java8 lambdas是否像匿名类一样维护对其封闭实例的引用?

时间:2015-02-11 04:28:44

标签: lambda java-8 retrolambda

We know匿名类维护对其封闭实例的引用,这可能导致Android上下文泄漏。

由于retrolambda将lambda迁移到Java7,因此值得一试。

It seems Java8 lambdas没有这个问题,但是我找不到任何官方信息。

有任何线索吗?

2 个答案:

答案 0 :(得分:18)

Lambda表达式和方法引用仅在需要时捕获对this的引用,即直接引用this或访问实例(非static)成员时。

当然,如果你的lambda表达式捕获局部变量的值,并且该值包含对this的引用,那么它意味着引用this ......

答案 1 :(得分:15)

以下是一些信息。

从以下链接http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html: 这对内存管理有一个有益的含义:虽然内部类实例总是对其封闭实例有强引用,但是不从封闭实例捕获成员的lambda不保存对它的引用。内部类实例的这种特性通常可能是内存泄漏的来源(所谓的失效监听器问题)

您还可以看到http://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html 来自文字: 嵌套类:如果您的要求与本地类的要求类似,您希望使类型更广泛可用,并且您不需要访问本地变量或方法参数。

如果您需要访问封闭实例的非公共字段和方法,请使用非静态嵌套类(或内部类)。如果您不需要此访问权限,请使用静态嵌套类。