A classe anônima Java é muito semelhante ao fechamento do Javascript, mas o Java implementa isso de maneira diferente. (verifique a resposta de Andersen)
Portanto, para não confundir o Java Developer com o comportamento estranho que pode ocorrer para quem vem do fundo do Javascript. Eu acho que é por isso que eles nos forçam a usar final
, essa não é a limitação da JVM.
Vejamos o exemplo de Javascript abaixo:
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
Em Javascript, o counter
valor será 100, porque existe apenas umcounter
variável do começo ao fim.
Mas em Java, se não houver final
, ele será impresso 0
, porque enquanto o objeto interno está sendo criado, o 0
valor é copiado para as propriedades ocultas do objeto da classe interna. (existem duas variáveis inteiras aqui, uma no método local e outra nas propriedades ocultas da classe interna)
Portanto, qualquer alteração após a criação do objeto interno (como a linha 1), não afetará o objeto interno. Portanto, criará confusão entre dois resultados e comportamentos diferentes (entre Java e Javascript).
Acredito que é por isso que o Java decide forçá-lo a ser final, para que os dados sejam 'consistentes' do começo ao fim.