内部类中的非最终变量:应该由编译器自动修复吗?

问题描述 投票:0回答:1

当我使用内部类中的非最终变量时,出现编译错误:

public static void main(String[] args) {
    String s = "hello";
    s += "world";
    Object myObj = new Object() {
        public String toString() {
            return s; // compile error
        }
    };
    System.out.println(myObj);
}

但是,我可以通过添加一个虚拟最终变量

tmp
来解决此问题,该变量引用我想要访问的其他变量:

public static void main(String[] args) {
    String s = "hello";
    s += "world";
    final String tmp = s;
    Object myObj = new Object() {
        public String toString() {
            return tmp; // that works!
        }
    };
    System.out.println(myObj);
}

添加临时最终变量的过程可以很容易地自动化,例如通过编译器。

我的问题是:为什么编译器不自动执行允许我们消除此错误的简单更改?

java inner-classes
1个回答
0
投票

编译器无法用常量替换对局部变量的所有引用,但是当构造内部类的实例时,该值会传递给适当的构造函数并存储在变量中。 根据需要,自动实现比较麻烦。

© www.soinside.com 2019 - 2024. All rights reserved.