variável final em inner class de método

Olá,

No livro da certificação, diz que uma Inner Class declarada dentro de um método não pode acessar uma variável local do método, por que esta variável tem escopo somente dentro do método, ou seja na pilha, e uma instância da Inner Class pode ser passado como parâmetro para outro método e ainda precisar residir no heap, mas se esta variável local no método for final, compila sem problemas, eu não entendi isto, pois acredito eu que a variável final apenas não permite que sua referência seja alterada mas ao terminar o método ela também se perde, ou seja inda estará na pilha, alguém pode me explicar por que uma variável com o modificador final aceita a compilação?

[code] public void go(){

	final String test = "teste";
	
	class Inner{
		public void testes(){							
			System.out.println(test);
		}
	}
	
	Inner i = new Inner();
	i.testes();
}[/code]

Encontrei uma explicação bem básica neste link: http://geekexplains.blogspot.com.br/2008/06/why-inner-classes-can-access-only-local.html

Basicamente a explicação foi: Pois se as Inner Classes pudessem acessar as variáveis locais, elas teriam que ser copiadas para outro lugar de modo a tornarem-se acessíveis pela Inner Class, o que poderia gerar várias cópias da mesma variável e correr o risco de ter dados inconsistentes. E já que as variáveis FINAL são imutáveis, qualquer número de cópias dessa variável não causarão problema nenhum de consistência. Por isso é permitido apenas o acesso a variáveis final em Inner Classes Locais.

Espero ter ajudado.

faz todo o sentido, no livro apenas diz que só se poderia usar variáveis FINAL, mas não explica o motivo, mas se for feita uma cópia da variável local da pilha para outro lugar o risco é muito grande.

obrigado!

Pois é… As vezes entender o porque ajuda bem mais do que só saber que pode ou não pode. Muitas vezes eu decoro as coisas de maneira melhor entendendo o porque do que apenas decorando por decorar.