首页 > 解决方案 > Lambda 捕获的变量是否可以保证在 Lambda 的整个生命周期中都存在?

问题描述

在 Java 中,捕获的 lambda 变量的值可以在原始变量的范围之外使用,如下所示:

interface MyInterface{
    void doSomething(  );
}

class Example {
 MyInterface lambda;
 public static void main(String[] args) {
     Example e = new Example();
     e.f1();
     e.f2();
 }
 void f1() {
     int local = 777;
     lambda = () -> System.out.println(local);
 }
 void f2() {
     lambda.doSomething(); // prints 777
 }
}

匿名类也可以做到这一点。我怀疑实现会通过复制捕获本地值来做到这一点。

规范是否保证捕获的本地人能够在 lambda 中存活多久?

我希望参考文档中的相关段落。(我找了,没找到)

标签: javalambdaclosures

解决方案


我怀疑实现会通过复制捕获本地值来做到这一点。

正确的。因为如果捕获的本地被修改,这将令人难以置信的混乱,javac除非捕获的变量被标记为 [A] 或 [B] '有效地最终',否则将拒绝编译您的代码final,这在规范中,这意味着:你可以将其标记为最终。

只要需要,此副本就会存在。一般来说,文档向您保证,除非您涉及 JNI,否则您无法在 java 中获取核心转储,并且垃圾收集规范不会比这更进一步。


推荐阅读