2012-06-01 86 views
2

我正在使用Depedency injection Google Guice Framework進行項目。兩個單例實例依賴注入(Google Guice)

這是可能的一個類綁定的singleton範圍,吉斯爲:

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

如果FooImpl類本身就是一個真正的單例類爲:

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(); 
     // ... 
    } 

    // ... 
} 

所以,可以在項目中聲明兩個單例,第一個聲明d由Guice和第二個由getInstance() traditionalnal方式。

Google Guice還可以通過toInstance()方法將接口綁定到特定實例。

所以,用辛格爾頓範圍,而不是結合,shouln't有更好的方式與這個聲明綁定辛格爾頓,在Java:

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

,而不是第一個?它更安全嗎?這樣可以有兩個單例實例嗎?

用Google Guice聲明單身人士的最佳方式是什麼?

回答

4

你提示第一種方法是優選的:

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

這允許根據需要吉斯在FooImpl執行依賴注入。這是而不是當您使用toInstance()作爲最後一個建議時,手動綁定到實例時可能會出現這種情況。

最後,Singleton設計模式is an anti-pattern for many reasons。請注意,這指的是使用getInstance()等的實現;在您的應用程序的整個生命週期中擁有一個類的單個實例(如Guice的SINGLETON範圍內的對象)是而不是不利用任何方法。

另請參閱Guice's page on scopes瞭解單例作用域的一些使用準則。

+0

我知道Singleton是一種反模式,但我不是最初的代碼設計器,所以我必須使用它! –

+0

但是,使用第一種方式,有可能是某人出錯,忘記了依賴注入以及用新的創建單例實例。因此,在這種情況下,我們應該有兩個單例實例,這是一個問題(在我的項目中,例如) –

+0

通常情況下,您會將實現('FooImpl')的可見性限制爲私有包等。因爲你是對的:用戶不應該自己創建實例。請參閱[關於隱藏構造函數的此鏈接](http://code.google.com/p/google-guice/wiki/KeepConstructors隱藏)。如果您堅持使用'FooImpl',那麼您已經超越了最佳解決方案。我認爲綁定這個實例(你的最後一個建議)將是第二好的。 – Torious