java - 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 中存活多久?
我希望参考文档中的相关段落。(我找了,没找到)
解决方案
我怀疑实现会通过复制捕获本地值来做到这一点。
正确的。因为如果捕获的本地被修改,这将令人难以置信的混乱,javac
除非捕获的变量被标记为 [A] 或 [B] '有效地最终',否则将拒绝编译您的代码final
,这在规范中,这意味着:你可以将其标记为最终。
只要需要,此副本就会存在。一般来说,文档向您保证,除非您涉及 JNI,否则您无法在 java 中获取核心转储,并且垃圾收集规范不会比这更进一步。
推荐阅读
- python - 如何生成扁平列表的所有排列?
- node.js - ExpressJS/Passport-SAML Single Log Out 直接重新登录
- javascript - 在使用 JavaScript 提交时将类添加到输入
- django - Heroku 超时
- php - 使用php从字符串中提取值
- android - 匕首2的问题
- java - 从资源文件夹中读取文件总是在 Spring Boot 应用程序中给出 Inputstream 为空
- uwp - [UWP][InkCanvas] 如何在 Touch 中使用 InkCanvas 绘制路径
- deep-learning - 标量类型 Short 的预期对象,但在调用 _th_mm 时获得了参数 #2 'mat2' 的标量类型 Float
- validation - 在 Kotlin 中,根据属性的类型限制注解目标