Я работаю с некоторым кодом, где один объект, "foo", создает другой
объект, "bar" и передавая ему Callable
. После этого foo вернется
бар, а затем я хочу, чтобы 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 достаточно умен чтобы не включать ссылку в этом случае.
Итак... экземпляр анонимного внутреннего класса удерживает ссылку на свой охватывающий экземпляр, даже если он никогда не использует ссылка на экземпляр экземпляра?