我正在使用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聲明單身人士的最佳方式是什麼?
我知道Singleton是一種反模式,但我不是最初的代碼設計器,所以我必須使用它! –
但是,使用第一種方式,有可能是某人出錯,忘記了依賴注入以及用新的創建單例實例。因此,在這種情況下,我們應該有兩個單例實例,這是一個問題(在我的項目中,例如) –
通常情況下,您會將實現('FooImpl')的可見性限制爲私有包等。因爲你是對的:用戶不應該自己創建實例。請參閱[關於隱藏構造函數的此鏈接](http://code.google.com/p/google-guice/wiki/KeepConstructors隱藏)。如果您堅持使用'FooImpl',那麼您已經超越了最佳解決方案。我認爲綁定這個實例(你的最後一個建議)將是第二好的。 – Torious