odas as variáveis finais são capturadas por classes anônima
Pensei que sabia a resposta para isso, mas não consigo encontrar nenhuma confirmação depois de uma hora de pesquis
Neste código:
public class Outer {
// other code
private void method1() {
final SomeObject obj1 = new SomeObject(...);
final SomeObject obj2 = new SomeObject(...);
someManager.registerCallback(new SomeCallbackClass() {
@Override
public void onEvent() {
System.out.println(obj1.getName());
}
});
}
}
Assuma issoregisterCallback
salva seu parâmetro em algum lugar, para que o objeto da subclasse anônima permaneça por um tempo. Obviamente, esse objeto deve manter uma referência aobj1
de modo aonEvent
funcionará se for chamado.
Mas dado que o objeto não usaobj2
, ainda mantém uma referência aobj2
, de modo aobj2
não pode ser coletado como lixo enquanto o objeto vive? Fiquei com a impressão de quetodo visívelfinal
s variáveis e parâmetros locais (ou efetivamente finais) foram capturados e, portanto, não puderam ser colocados em GC enquanto o objeto estivesse vivo, mas não consigo encontrar nada que diga de uma maneira ou de outr
Depende da implementação?
Existe uma seção no JLS que responde a isso? Não consegui encontrar a resposta lá.