Javaの無名クラスはJavaScriptのクロージャと非常に似ていますが、Javaはそれを異なる方法で実装します。(アンデルセンの答えを確認してください)
そのため、Java開発者を、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
値が1つしかないため、値は100になります。counter
最初から最後まで変数。
しかし、Javaでは、 final
、それはアウト印刷されません0
内部オブジェクトが作成されている間、ので、0
値は内部クラスのオブジェクトの隠されたプロパティにコピーされます。(ここには2つの整数変数があり、1つはローカルメソッドにあり、もう1つは内部クラスの非表示プロパティにあります)
したがって、内部オブジェクトの作成後の変更(1行目など)は、内部オブジェクトには影響しません。そのため、2つの異なる結果と動作(JavaとJavaScriptの間)が混同されます。
それがJavaが最終的なものになることを強制することを決定した理由だと私は信じています。そのため、データは最初から最後まで「一貫しています」。