2

Depedency Injection Google Guice Framework を使用するプロジェクトに取り組んでいます。

Guice では、次のようにシングルトン スコープでクラスをバインドできます。

bind(Foo.class).to(FooImpl.class).in(Scopes.SINGLETON);

FooImplclass 自体が次のような実際のシングルトン クラスである場合:

public class FooImpl implements Foo{
    public static final FooImpl INSTANCE = new FooImpl();
    public static FooImpl getInstance(){...}
    // ...
}

また

public class FooImpl implements Foo{
    private FooImpl instance = null;

    private FooImpl(){...}
    public static FooImpl getInstance(){
         if(instance == null)
             instance = new FooImpl();
         return FooImpl();
         // ...
    }

    // ...
}

そのため、プロジェクトで 2 つのシングルトンを宣言することが可能です。1 つ目は Guice によって宣言され、2 つ目はgetInstance()従来の方法で宣言されます。

Google Guice は、メソッドを使用してインターフェイスを特定のインスタンスにバインドすることもできますtoInstance()

したがって、Singleton スコープでバインドする代わりに、Java で次の宣言を使用して Singleton をバインドするより良い方法ではありません。

bind(Foo.class).toInstance(FooImpl.getInstance());

最初のものの代わりに?より安全ですか?そのように2つのシングルトンインスタンスを持つことは可能ですか?

Google Guice でシングルトンを宣言する最良の方法は何ですか?

4

1 に答える 1

4

あなたが提案する最初のアプローチが推奨されます:

bind(Foo.class).to(FooImpl.class).in(Scopes.SINGLETON);

これにより、Guice は必要に応じて依存性注入を実行できFooImplます。最後の提案のようにインスタンスに手動でバインドする場合、これは不可能です。toInstance()

最後に、Singleton 設計パターンは多くの理由でアンチパターンです。これは、などを使用した実装を指すことに注意してくださいgetInstance()。アプリの存続期間中 (Guice のSINGLETONスコープ内のオブジェクトのように)クラスのインスタンスを 1 つ持つことは、決して悪いことではありません。

シングルトン スコープの使用ガイドラインについては、スコープに関する Guice のページも参照してください。

于 2012-06-01T19:56:10.180 に答える