我正在使用一些代码,其中一个对象“foo”正在创建另一个对象“bar”,并将其传递给Callable
. 在此 foo 将返回 bar 之后,然后我希望 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 编译器可能足够聪明以至于在这种情况下不包含引用。
那么......即使匿名内部类的实例从未实际使用封闭实例引用,它是否会保留对其封闭实例的引用?