为什么即使事后没有修改,Java中的局部变量也不被视为“有效的最终变量”?

Randy Sugianto'Yuku':

在一种方法中,我有这个:

int x = 0
if (isA()) {
    x = 1;
} else if (isB()) {
    x = 2;
}

if (x != 0) {
    doLater(() -> showErrorMessage(x)); // compile error here
}

// no more reference to 'x' here

我不明白为什么会产生编译错误。该错误表明x它不是最终的,也不是有效的最终确定的,因此无法从lambda主体进行访问。调用x没有对的修改doLater,因此x实际上在doLater调用时已确定的值

我猜这个问题的答案是因为x没有资格被称为有效最终变量。但是,我想知道原因是什么。

编译器不能只是创建一个临时的最终变量,从而使代码像这样:

if (x != 0) {
    final int final_x = x;
    doLater(() -> showErrorMessage(final_x));
}

一切仍然一样吗?

彼得·劳瑞:

有效地最终意味着它可以实现,final即永远不变。这意味着变量实际上可以是final一个。

问题在于它不会跟踪您上次更改它的时间,而是您曾经更改过它。将您的if声明更改

int x;
if (isA()) {
    x = 1;
} else if (isB()) {
    x = 2;
}  else {
    x = 0;
}

要么

int x = isA() ? 1 : 
        isB() ? 2 : 0;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我在一个封闭的范围定义的局部变量必须被最终或最后有效

封闭范围中定义的局部变量必须是final或有效的final

Java:封闭范围中定义的局部变量mi必须是final或有效的final

为什么有人在Java中将局部变量和方法参数标记为“最终”?

变量“有效最终”是什么意思?

为什么Java中没有局部静态变量?

为什么局部变量在Java中是线程安全的

为什么局部变量在Java中也称为“自动”?

Java中的局部变量和实例变量有什么区别

如何从Java字节码中判断局部变量是否为“最终”?(与BCEL有关)

访问最终的局部变量时,为什么在Java中有此InstantiationException?

SonarQube-Java-强制局部变量有效地为最终变量

Lambda Expression没有有效的最终变量

为什么eclipse会说即使使用了局部变量也没有使用?

使用局部变量有什么好处?

实例变量可以有效地最终确定吗/ Java中仅局部变量有效地最终确定吗?

为什么我的函数局部变量之间在堆栈中没有存储空间?

封闭范围中定义的局部变量列表必须是最终的或有效地最终

为什么我的局部变量没有被覆盖?

内部类引用的局部变量必须是最终变量或有效最终变量

活动的局部变量在OnDestroy()之后仍然有效

在迭代 HashMap 时引用局部变量 -> 从 lambda 表达式引用的局部变量必须是最终的或有效的最终错误

我在封闭范围内定义的 JAVA、SWT 局部变量必须是最终的或有效的最终变量

为什么按值传递局部变量有效?

JRE 如何为具有非有效最终局部变量的 lambda 主体创建并发问题?

当从匿名内部类或 lambda 访问时,为什么数组的值被视为最终或“有效最终”?

如果我不断收到错误怎么办:在封闭作用域中定义的局部变量 j 必须是最终的或有效的最终

获取在封闭范围内定义的局部变量必须是最终的或有效的最终

为什么全局变量没有在没有将其重新声明为局部变量的函数内更新?