Java匿名类与Javascript闭包非常相似,但是Java以不同的方式实现。(检查安徒生的答案)
因此,为了不将Java Developer与那些来自Javascript背景的人所发生的奇怪行为混淆。我想这就是他们强迫我们使用的原因final
,这不是JVM的限制。
让我们看下面的Javascript示例:
var add = (function () {
var counter = 0;
var func = function () {
console.log("counter now = " + counter);
counter += 1;
};
counter = 100; // line 1, this one need to be final in Java
return func;
})();
add(); // this will print out 100 in Javascript but 0 in Java
在Javascript中,该counter
值将为100,因为counter
从头到尾只有一个变量。
但是在Java中,如果没有final
,它将打印出来0
,因为在创建内部对象时,会将0
值复制到内部类对象的隐藏属性。(这里有两个整数变量,一个在局部方法中,另一个在内部类隐藏属性中)
因此,内部对象创建后的任何更改(如第1行)都不会影响内部对象。因此,这将使两个不同的结果和行为(Java和Javascript之间)混淆。
我认为,这就是Java决定强制将其定为最终版本的原因,因此数据从始至终都是“一致的”。