This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public void criaInterface() { | |
String var = "content"; | |
botao.setOnClickListener(new OnClickListener() { | |
@Override | |
public void onClick(View view) { | |
System.out.println(var); // ERRO! | |
} | |
}); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public void criaInterface() { | |
final String var = "content"; | |
botao.setOnClickListener(new OnClickListener() { | |
@Override | |
public void onClick(View view) { | |
System.out.println(var); // OK! | |
} | |
}); | |
} |
Quando temos uma inner class ela não é gerada no mesmo arquivo de byte code da classe que a contém (outer class), são gerados dois arquivos, um com a outer class e outro com a inner class:
Classe1.class
Classe1$OnClickListener.class
Aqui surge um problema, nossa classe Classe1$OnClickListener.class precisa acessar a variável "content" declarada em Classe1.class. Para que isso seja possível o compilador cria em Classe1$OnClickListener.class um atributo que recebe uma cópia do valor da variável da outer class. Mas imagine que por algum motivo a variável em Classe1.class ou mesmo o atributo em Classe1$OnClickListener.class tenha seu valor alterado, teriamos um problema de sincronização de dados. Para evitar este problema somos obrigados a declararmos as variáveis que serão usadas em inner classes como final, assim os valores tanto nas outer classes e inner classes serão iguais.
Referências:
- http://stackoverflow.com/questions/7423028/java-local-variable-visibility-in-anonymous-inner-classes-why-is-final-keywo
- http://techtracer.com/2008/04/14/mystery-of-accessibility-in-local-inner-classes/
Nenhum comentário:
Postar um comentário