1

重複の可能性:
オブジェクトをインスタンス化した後に init メソッドを呼び出す Guice

コンストラクターからのリークを避けるため、特に構築後に untilthisなどの呼び出しを避けるために、(特に Java Concurrency in Practice で) 推奨されているのを見てきました。registerListener(this)推奨される回避策は、最初にコンストラクターを呼び出し、次にそれらの信頼できない外部メソッド呼び出しを行う静的ファクトリを使用することです。コンストラクターは (package-)private になります。残念ながら、Guice はそのようなファクトリ メソッドを明示的に思いとどまらせます。また、元のクラスで自動インジェクションを取得しながらファクトリ メソッドを使用する方法はないと思います。これは一般的で自然な問題のように感じます。Guiceでこれを行う簡単な方法はありますか?

4

1 に答える 1

1

Guice モジュールのプロバイダー メソッドを使用してそれを行うことができます。

@Provides
Listener listener(Colaborator test, Collection<Listener> listeners) {
    Listener newListener = new Listener(test);
    listeners.register(newListener);
    return listener;
}

ただし、これは初期化シーケンスにとって問題になる可能性があります。また、共同作業者 (コンストラクターのパラメーター) が多数ある場合、これは醜くなる可能性があります。

型リスナーを使用する別の方法があります。あなたが何をしているのかがより明白なので、私は上記の方法の方が好きです。ただし、オブジェクトをインスタンス化した後に init メソッドを Guice で呼び出す方がよい場合もあります。

于 2012-12-05T09:37:09.553 に答える