【问题标题】:Do Java8 lambdas maintain a reference to their enclosing instance like anonymous classes?Java8 lambda 是否像匿名类一样维护对其封闭实例的引用?
【发布时间】:2015-02-11 04:28:43
【问题描述】:

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

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

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

有什么线索吗?

【问题讨论】:

  • 您问的是常规 lambda 还是 Retrolambda 生成的字节码?如果你问的是常规 lambda,Retrolambda 与这个问题有什么关系?
  • 据我了解,retrolambda 使用 Java8 生成字节码,答案可能对两者都有效。

标签: lambda java-8 retrolambda


【解决方案1】:

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

当然,如果您的 lambda 表达式捕获了一个局部变量的值并且该值包含对 this 的引用,则它也意味着引用 this...

【讨论】:

【解决方案2】:

这里有一些信息。

来自以下链接http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html: 这对内存管理有一个有益的影响:虽然内部类实例始终持有对其封闭实例的强引用,但不从封闭实例捕获成员的 lambdas 不持有对它的引用。内部类实例的这一特性通常会导致内存泄漏(即所谓的失效侦听器问题)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 2012-02-17
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多