私は、あるオブジェクト「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 コンパイラはそのような場合に参照を含めないようにするのに十分スマートです。
では、匿名の内部クラスのインスタンスは、実際に囲んでいるインスタンス参照を使用していなくても、囲んでいるインスタンスへの参照を保持しますか?