La classe anonima Java è molto simile alla chiusura di Javascript, ma Java la implementa in modo diverso. (controlla la risposta di Andersen)
Quindi, al fine di non confondere lo sviluppatore Java con lo strano comportamento che potrebbe verificarsi per coloro che provengono da Javascript background. Immagino sia per questo che ci costringono a usare final
, questa non è la limitazione di JVM.
Diamo un'occhiata all'esempio Javascript di seguito:
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
In Javascript, il counter
valore sarà 100, perché ce n'è solo unocounter
variabile dall'inizio alla fine.
Ma in Java, se non c'è final
, verrà stampato 0
, perché mentre l'oggetto interno viene creato, il 0
valore viene copiato nelle proprietà nascoste dell'oggetto di classe interno. (ci sono due variabili intere qui, una nel metodo locale, un'altra nelle proprietà nascoste della classe interna)
Pertanto, qualsiasi modifica dopo la creazione dell'oggetto interno (come la linea 1), non influirà sull'oggetto interno. Quindi creerà confusione tra due diversi risultati e comportamenti (tra Java e Javascript).
Credo che sia per questo motivo che Java decide di forzarlo a essere definitivo, quindi i dati sono "coerenti" dall'inizio alla fine.