オブジェクト "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コンパイラは、その場合の参照が含まれていないのに十分な スマートです必要があります。
匿名の内部クラスのインスタンスは、実際に のインスタンス参照を使用することがない場合でも、囲むインスタンスへの参照を に保持しますか?
間違いなく静的クラスを使用します。それはその冗長なIMOではありません。 –
@deepcパラメータごとに1行のフィールドを追加する必要があります。また、各パラメータに2行と1を加えたコンストラクタも追加する必要があります。そのため、単純に3引数のRunnableの場合、少なくとも8行以上のコードが必要です。匿名の内部クラス構文は、適切なラムダ式構文と比べて既にかなり冗長です.1つのメソッドクラスには、ラムダ式では必要ない定型文の4行があります。したがって、Javaでの3パラメータの1行ラムダ式は13行のコードになります。あなたはそれを「冗長」と見なす必要がありますか? –
あなたはあなたのライン "統計"に合っています。たぶんそれは個人的な味です。しかし、すべての後に 'call()'メソッドもそこになければなりません。そして今、別のクラスを正当化するのに十分なコードがあります(あなたが指摘するように必ずしもトップレベルのクラスである必要はありません)。私には、コードはこのようにきれいに見えます。その方法が数行よりも長い場合はさらにそうです。 –