Я думал, что знаю ответ на этот вопрос, но я не могу найти никакого подтверждения после часа или около того поиска.
В этом коде:
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());
}
});
}
}
Предположим, что registerCallback
где-то сохраняет свой параметр, так что объект анонимного подкласса будет жить некоторое время. Очевидно, что этот объект должен поддерживать ссылку на obj1
чтобы onEvent
работал, если он вызывается.
Но, учитывая, что объект не использует obj2
, он все еще поддерживает ссылку на obj2
, так что obj2
не может быть собран мусором, пока объект живет? У меня сложилось впечатление, что все видимые final
(или фактически конечные) локальные переменные и параметры были захвачены и, таким образом, не могут быть скопированы, пока объект был жив, но я не могу найти ничего, что говорит так или иначе. Другой.
Это зависит от реализации?
Есть ли раздел в JLS, который отвечает на это? Я не смог найти ответ там.