¿Todas las variables finales son capturadas por clases anónimas?
Pensé que sabía la respuesta a esto, pero no puedo encontrar ninguna confirmación después de aproximadamente una hora de búsqueda.
En este 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());
}
});
}
}
Asumir queregisterCallback
guarda su parámetro en algún lugar, para que el objeto de la subclase anónima viva por un tiempo. Obviamente este objeto tiene que mantener una referencia aobj1
así que esoonEvent
funcionará si se llama.
Pero dado que el objeto no usaobj2
, ¿aún mantiene una referencia aobj2
, así que esoobj2
no se puede recolectar basura mientras el objeto vive? Tenía la impresión de quetodo visiblefinal
(o efectivamente final) las variables y parámetros locales se capturaron y, por lo tanto, no se pudieron GC 'mientras el objeto estaba vivo, pero no puedo encontrar nada que diga de una manera u otra.
¿Depende de la implementación?
¿Hay una sección en el JLS que responda a esto? No pude encontrar la respuesta allí.