java - 为什么传递给 runnable 的变量需要是最终的?

标签 java variables final runnable

如果我有一个变量 int x = 1,比如说,我在主线程中声明了一个 runnable,并且我想将 x 传递给 runnable 的 run() 方法,它必须声明为 final。为什么?

final int x = 0;//<----must be final...
private class myRun implements Runnable {

    @Override
    public void run() {
        x++;//
    }

}

最佳答案

因为语言规范就是这么说的。 According to Guy Steele ,此选择背后的基本原理是程序员希望方法中的声明 int x = 0 导致堆栈分配存储,但如果您可以返回 new myRun() 从方法(或以其他方式让 myRun 持续超过函数的返回)并且你可以在之后修改它,然后 x 必须堆分配而不是让您期望的语义。

他们本可以这样做,事实上其他语言也这样做了。但是 Java 设计者决定改为要求您将 x 标记为 final 以避免要求实现堆分配看起来像堆栈分配存储的东西。

(我应该注意:这不是特定于Runnable。它适用于任何匿名内部类。)

关于java - 为什么传递给 runnable 的变量需要是最终的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11424753/

相关文章:

php - 我什么时候应该使用 "final"?

java - 在 Java 中分配最终字段

java - 'public static final' 还是带有 setter/getter 的 'private static final'?

java - 值应该只匹配数字、点和逗号

java - 如何设计返回两个不同返回类型的类方法?

java - 如何保护用于服务器到服务器通信的 App Engine 端点?

linux - Bash 字符串比较不起作用

c++ - 在 C++ 中是否有等效的 Java equals 方法?

java - 在 OQL 的堆转储中获取类的静态字段

c# - 为什么不能设置公共(public) Var?