私はレガシーという名前の既存のクラスを持っていますが、これはほとんどが古い学校のシングルトンパターンで書かれています。今私はそれに新しいフィールドを導入したい、私はGuiceを使用したいと思います。レガシー自体はGuiceコントロールではなく、別のServiceクラス(サービスクラス内ではレガシークラスのgetInstance()を呼び出してレガシーオブジェクトを取得しています)によって使用され、そのサービスクラスはGuiceインジェクタを使用して作成されています。私が試した何既存のシングルトンクラスにguice injectionを使用するには?
public class Legacy {
public synchronized static Legacy getInstance() {
if(sInstance == null) {
sInstance = new Legacy();
}
return sInstance;
}
private Legacy() {
legacyObj = LegacyField.getInstance(); // get a singleton
}
private static Legacy sInstance;
private LegacyField legacyObj;
private NewField newObj; // this is the new dependency I would like to add using Guice
}
が、私はこの方法は、レガシークラス
@Inject
public void setNewField(NewField newObj) {
this.newObj = newObj;
}
へとサービスのモジュールファイルに注入し入れてみましたということで、私はニューフィールドオブジェクトを結合するが、私はプログラムを実行すると、それはNullPointer例外をスローしました。だから注射がうまくいかない。私のプログラムにNewFieldを注入する方法はありますが、現在の古い学校のシングルトンのパラダイムを維持し、それ以外は何も変えないでください。
EDIT 以下の解決策は少なくとも3つありますが、どちらが最適か、それとも同等かはわかりません。
3つのソリューションは多かれ少なかれ同等です。彼らはあなたのシングルトンに(直接的または間接的に) 'injectMembers'を呼び出します。 –