java 是否应该给出有关从内部 类 分配私有变量的错误消息?

Should java give an error message about assigning a private variable from inner classes?

我有一些这样的代码:

class Outter {
    private Bar bar;

    [...]

    public update() {
        provider.doUpdate(new IListenner() {
            @Override
            public void onSuccess(Bar bar) {
                Outter.this.bar = bar;
                // Here, Outter.this.bar.equals(bar) is false.
            }
        }
    }

    [...]

}

我认为这与 Java 在我的闭包中捕获变量的方式有关,捕获 bar reference 而不是捕获 Outer 实例引用。如果我写:

Outter self = Outter.this;
self.bar = bar;

它有效,迫使 Java 编译器在其闭包中存储对我的 Outter instance 的引用,而不是对 bar 字段的引用。

正确的做法可能是在 Outter 中使用 setBar(Bar bar) 并从内部调用它 class.

但既然它不起作用,为什么 Java 编译器不给出有关它的错误消息?在捕获非最终引用时喜欢 bar should be final ?

我使用 Android Studio 1.2.1.1 编译这个,没有在其他环境中尝试过,不知道 Android Studio 实际如何编译 Java。我的 JRE 似乎是来自 openjdk-7-jre-headless Debian 软件包版本 7u79-2.5.5-1~deb8u1.

的 Java 1.7.0

您报告的行为听起来很奇怪。首先,我无法使用 ECJ 或 javac 7 重现它。(参见 http://ideone.com/B4CoQs

字节码的区别

Outter.this.bar = bar;

Outter self = Outter.this;
self.bar = bar;

只是一个额外的astore_2/aload_2,基本上对应一个空操作

我鼓励你检查你的假设。也许您的 Bar.equals 实现有问题,导致了混淆。

Like bar should be final when capturing the non-final reference?

从这个意义上讲,字段没有被捕获。可以从内部 类 / 方法访问字段而不是最终的。