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...