La clase anónima de Java es muy similar al cierre de Javascript, pero Java lo implementa de manera diferente. (verifique la respuesta de Andersen)
Entonces, para no confundir al Desarrollador Java con el comportamiento extraño que podría ocurrir para aquellos que provienen de un fondo Javascript. Supongo que es por eso que nos obligan a usar final
, esta no es la limitación de JVM.
Veamos el ejemplo de Javascript a continuación:
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
En Javascript, el counter
valor será 100, porque solo hay unocounter
variable de principio a fin.
Pero en Java, si no hay final
, se imprimirá 0
, porque mientras se crea el objeto interno, el 0
valor se copia en las propiedades ocultas del objeto de clase interna. (aquí hay dos variables enteras, una en el método local y otra en las propiedades ocultas de la clase interna)
Entonces, cualquier cambio después de la creación del objeto interno (como la línea 1), no afectará al objeto interno. Por lo tanto, creará confusión entre dos resultados y comportamientos diferentes (entre Java y Javascript).
Creo que es por eso que Java decide obligarlo a ser definitivo, por lo que los datos son 'consistentes' desde el principio hasta el final.