2016-07-04 20 views
1

ユーザーが有効または無効にできる機能の開発を進めています。 これは別のモジュールで実装され、いくつかのスレッドといくつかのシングルトンを作成します。 私は別のモジュールを持っているので、後でそれを別のプロセスで実行しようとしているので、別のguiceインジェクタを使用しました。 だから私は、インジェクタを作成し、機能インタフェースを実装するクラスを返すファクトリメソッド(それは3つのインターフェイスを持っている)機能を正しく作成してシャットダウンする方法

public class FeatureFactory { 
    private Injector injector; 
    public FeatureClass open() { 
     injector = createInjector(); 
     return injector.getInstance(FeatureClass.class); 
    } 
} 

public class FeatureClass implements InterfaceA, InterfaceB, InterfaceC { 

} 

質問があります。

  1. が新しいインジェクターを作成することをお勧めしますこの場合?私は全体のフィーチャーが別のモジュールに入っていることを意味しますか? アイデアはそれらを切り離し、新しい機能guiceモジュールをフィーチャーAPIの一部として持たないことでした。そうでない場合、よりよいアプローチは何でしょうか?
  2. インターフェイスの代わりにフィーチャクラスを返すことは、良いにおいをしません。 これはユーザーに実装について知らせる これをどのように克服するのですか? 現在、アプリケーションguiceモジュールを使用して、インターフェイスをFeatureClassにバインドしました。
  3. どのように機能を閉じ、すべてのクラスをガベージコレクションしましたか?私が言ったように 、機能が開かれると、いくつかのシングルトンとスレッドが作成されます。 インジェクタフィールドをnullにすると、すべてがガベージコレクションされますか?
+0

あなたの最初の質問は、[ヘルプ/トピック]に従って広すぎると主に意見に基づいていますので、それに応じてあなたの質問を[編集]してください。 –

答えて

1

複数のインジェクタを作成することは、一般的には好ましくありません。シングルトンはインジェクタでスコープされるため、複数のインジェクタを作成すると、シングルトンはもはやシングルトンではなくなります。代わりに

、呼び出し側は、クラスのインスタンスを作成することを可能にするファクトリクラスを作成し、その工場にあなたは、もちろん、代わりにあなたのAPIとしてシングルトンProvider<FeatureClass>を使用することができProvider<FeatureClass>

@Singleton 
public class FeatureClassFactory { 
    private final Provider<FeatureClass> provider; 
    private FeatureClass instance; 

    @Inject 
    FeatureClassFactory(Provider<FeatureClass> provider) { 
    this.provider = provider; 
    } 

    public synchronized FeatureClass get() { 
    if (instance == null) { 
     instance = provider.get(); 
    } 
    return instance; 
    } 
} 

を注入1)私の公開APIにGuiceインターフェースを使用するのが好きではなく、2)生産モードでは、インジェクタが初期化されたときにシングルトンが作成され、FeatureClassインスタンスの作成を遅らせたいと言ったとします。

実装とクラスを返す場合は、議論の余地があり、ユースケースとコーディングスタイルによって異なります。

最後に、シングルトンはインジェクタでスコープされているため、インジェクタはすべてのシングルトンに対して強い参照を保持します。アプリケーションの存続期間中にメモリを解放する必要がある場合は、フィールドをnullに設定したり、コレクションをクリアしたりすることによってクラスをメモリを解放する必要があります。

+0

ありがとうございます。新しいインジェクターの作成に関して。私がこれをやりたかった理由は、全体の機能が別のモジュール(個別のjarファイル)で書かれているため、jarのapiとしてguiceモジュールを必要としなかったからです。私はこれをデカップリングしたかったのです。これは新しいインジェクタを作成する正当な理由ではありませんか?私はもちろん、シングルトンは新しいインジェクタのコンテキストでシングルトンだけであることを理解しています。 –

+0

@NirBrachelは、jarを使用するユーザがGuiceを使用するかどうかによって異なります。そうであれば、モジュールはきれいなAPIになり、インジェクタを作成することは問題になります – NamshubWriter

関連する問題