Campo final e classe anônima
Eu ainda não estou satisfeito com a explicação sobre a classe anônima e o campo final. Havia toneladas de perguntas tentando explicar o problema óbvio, mas eu não encontrei respostas para todas as minhas perguntas :-)
Suponha o seguinte código:
public void method(final int i, int j) {
final int z = 6;
final int x = j;
int k = 5;
new Runnable() {
public void run() {
System.out.print(i);
System.out.print(x);
System.out.print(z);
System.out.print(k);
}
};
}
Não é possível compilar este código por causa de "unfinal"k
propriedade.Eu entendo que o compilador pode substituirz
propriedade com o valor declarado durante o tempo de compilação.Quando eu procurei por solução como exatamente pode funcionai
ex
Eu achei istoresponda que diz:
O compilador pode então substituir apenas o uso de lastPrice e o preço na classe anônima com os valores das constantes (em tempo de compilação, é claro), e você não terá mais o problema de acessar variáveis inexistentes.
Como isso poderia funcionar para camposi
ex
se eles são parâmetros do método? Eles não são conhecidos durante o tempo de compilação? Essa abordagem pode funcionarz
.
Por outro lado, há uma explicação sobreproblemas de pilha:
Isso permite que o compilador Java "capture" o valor da variável no tempo de execução e armazene uma cópia como um campo na classe interna. Depois que o método externo é finalizado e seu quadro de pilha é removido, a variável original desaparece, mas a cópia privada da classe interna persiste na própria memória da classe.
Eu entenderia que a classe anônima de alguma forma copiou todo o conteúdo necessário (campos) durante sua criação. Ausência definal
tem problema óbvio que, se algum códigoabaixo declaração de classe anônima mudaria o valor, a execução usada possívelstale
valores.
Mas ok, isso deve resolver o problema quando o método da classe anônima é executado fora do escopo das propriedades usadas.
Mas esta abordagem deve funcionaraté semfinal
declaração, uma vez que apenas copia todos os campos.
Ambas as abordagens parecem independentes para mim. Falando nisso - e isso poderia resolver minhas perguntas - eu não encontrei como o trabalhofinal
campo do método. Eles não são removidos da pilha mesmo se o método for concluído? Parece um absurdo para mim, mas isso explicaria muitas coisas :-)
Qual é a resposta correta?