Я работаю с некоторым кодом, где один объект, "foo", создает другой
объект, "бар", и передавая его Callable
. После этого фу вернется
бар, а затем я хочу, чтобы foo стал недоступным (то есть: доступен для
сборка мусора).
Моя первоначальная мысль состояла в том, чтобы просто создать Callable
анонимно. например:
class Foo {
...
public Bar createBar() {
final int arg1 = ...
final int arg2 = ...
final int arg3 = ...
return new Callable<Baz>() {
@Override
public Baz call() {
return new Baz(arg1, arg2, arg3);
}
};
}
}
Мне пришло в голову, что это может на самом деле работать не так, как хотелось бы, однако,
поскольку внутренний класс, как правило, сохраняет ссылку на включающий его объект.
Я не хочу, чтобы ссылка на включающий класс здесь, потому что я хочу, чтобы охватывающий объект был
собирается, пока Callable
все еще доступен.
С другой стороны,
обнаружение того, что включающий экземпляр фактически никогда не упоминается
должно быть довольно тривиальным, так что, возможно, компилятор Java достаточно умен
не включать ссылку в этом случае.
Итак ... будет ли экземпляр анонимного внутреннего класса удерживать
ссылка на включающий его экземпляр, даже если он на самом деле никогда не использует
ссылка на экземпляр?