
"Oi, amigo! Aqui estão mais algumas informações para você."
"Eu já disse a você que o compilador na verdade converte todas as classes anônimas em classes internas comuns."
"Sim. Eu até me lembro que seus nomes são números: 1, 2, 3, etc."
"Exatamente. Mas há outra nuance aqui."
"Se uma classe for declarada dentro de um método e usar qualquer uma de suas variáveis, as referências a essas variáveis serão adicionadas à classe gerada. Veja você mesmo."
"Começamos com isso:"
class Car
{
public ArrayList createPoliceCars(int count)
{
ArrayList result = new ArrayList();
for(int i = 0; i < count; i++)
{
final int number = i;
result.add(new Car()
{
public String toString()
{
return ""+number;
}
});
}
return result;
}
}
"E o compilador gera isso:
class Car
{
public ArrayList createPoliceCars(int count)
{
ArrayList result = new ArrayList();
for(int i = 0; i < count; i++)
{
final int number = i;
result.add(new Anonymous2 (number));
}
return result;
}
class Anonymous2
{
final int number;
Anonymous2(int number)
{
this.number = number;
}
public String toString()
{
return ""+ number;
}
}
}
"Você entendeu? A classe interna não pode alterar a variável local do método, porque no momento em que o código da classe interna é executado, podemos estar saindo do método completamente."
"Agora o segundo ponto. O método toString() usa uma variável passada. Para isso, foi necessário:"
A) salve-o dentro da classe gerada
B) adicioná-lo ao construtor.
"Entendi. Classes declaradas dentro de métodos sempre usam cópias de variáveis."
"Exatamente!"
"Então faz sentido por que as variáveis devem ser finais. E por que elas não podem ser alteradas. Se você estiver realmente trabalhando com cópias em vez dos originais, o usuário não entenderá por que ele não pode alterar os valores das variáveis, que significa que precisamos apenas proibi-lo de alterá-los."
"Certo, declarar variáveis como finais parece um pequeno preço a pagar em troca de fazer com que o compilador gere uma classe para você, passe-a para o método e salve todas as variáveis do método que você deseja usar."
"Eu concordo. Aulas locais anônimas ainda são super legais."
"Se eu declarar uma classe local dentro de um método e usar as variáveis do método nele, o compilador as adicionará à classe também?"
"Sim, ele irá adicioná-los à classe e seu construtor."
"Isso foi o que eu pensei."
GO TO FULL VERSION