我们都知道你不能做这样的事情:
int a = 7;
new Runnable() {
public void run() {
System.out.println(a);
}
}.run();
...
...没有做a
最后的。我得到了技术原因,这是因为局部变量存在于堆栈中,除非您知道它不会更改,否则您无法安全地制作副本。
然而,我很难看到的是为什么编译器没有实现黑客,所以当它看到上述情况时,它会编译成如下内容:
int[] a = {7};
new Runnable() {
public void run() {
System.out.println(a[0]);
}
}.run();
...
然后我们就可以安全地从匿名内部类访问 a 并且如果我们愿意的话确实可以更改它。当然,它可能仅在我们实际更改a
. 据我所知,这将是一个相对简单的东西,适用于所有类型并且允许a
从任何上下文中改变。当然,上述提议可以更改为对多个值使用合成包装类或其他更有效的方法,但想法是相同的。我猜对性能的影响很小,但我怀疑这会过度,尤其是在引擎盖下有更多优化的潜力。除了可能依赖于合成字段的某些反射调用以某种方式破坏之外,我看不到很多缺点,但我从未听说过它被认真提出!有什么原因吗?