34

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

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

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

有什么线索吗?

4

2 回答 2

24

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

当然,如果你的 lambda 表达式捕获了一个局部变量的值,并且该值包含对它的引用,this那么它也意味着引用this……</p>

于 2015-02-11T08:44:37.973 回答
21

这是一些信息。

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

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

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

于 2015-02-11T05:10:27.903 回答