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?
从这个意义上讲,字段没有被捕获。可以从内部 类 / 方法访问字段而不是最终的。
我有一些这样的代码:
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
.
您报告的行为听起来很奇怪。首先,我无法使用 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?
从这个意义上讲,字段没有被捕获。可以从内部 类 / 方法访问字段而不是最终的。