我剛剛和一個好友進行了一次小小的談話,他堅持認爲用於匕首的單身人士比通過老派 - 靜態 - 私人 - 變量方式製作單身人士好。不是說我肯定他錯了,我只想清理爲什麼更好。依賴注入框架(如Dagger)上的單例實現與普通靜態單例之間有什麼區別?
-1
A
回答
0
這個Java best practices book解釋了爲什麼你應該使用私人 構造函數或Enum類型來強制實施Singleton屬性。本章是很長,所以保持它概括爲:
製作類辛格爾頓可以 使其難以檢驗其客戶,因爲它不可能代替模擬實現 爲單身,除非它實現了作爲一個接口它的類型。 在版本1.5之前,有兩種實現單例的方法。兩者都是 基於保持構造函數爲私有,並導出公共靜態成員爲 提供對唯一實例的訪問。在一種方法中,所述構件是一個最終字段:
// Singleton with public final field
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public void leaveTheBuilding() { ... }
}
在第二方法實施單身,公共部件是 靜態工廠方法:
// Singleton with static factory
public class Elvis {
private static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public static Elvis getInstance() { return INSTANCE; }
public void leaveTheBuilding() { ... }
}
還有第三個方法來實施單身。通過簡單地 使枚舉類型有一個元素:
// Enum singleton - the preferred approach
public enum Elvis {
INSTANCE;
public void leaveTheBuilding() { ... }
}
這種方法在功能上等同於公共領域的做法,但它 更加簡潔,免費提供系列化機械,並提供了一個 切實保證針對多個實例化,即使在面對複雜的序列化或反射攻擊時也是如此。
雖然這種方法尚未被廣泛採用,但單元素枚舉類型是實現單例的最佳方式。
相關問題
- 1. 靜態屬性和單例之間有什麼區別?
- 2. 依賴注入 - 這兩個代碼之間有什麼區別?
- 3. 什麼依賴注入框架與WebForms
- 4. ASP.NET核心依賴注入:工廠和實例之間的區別?
- 5. PHP靜態類和單例類之間的確切區別是什麼
- 6. 兩個單例實例依賴注入(Google Guice)
- 7. 實用單例與依賴注入問題
- 8. Angular 2依賴注入單例
- 9. Titanium中的集合單例或實例有什麼區別?
- 10. 使用「using」的實例化與簡單實例化有什麼區別
- 11. 在Unity中,註冊單例實例的兩種方法有什麼區別?
- 12. Singleton對象和sessionfactory單例對象之間有什麼區別
- 13. 這兩個單例實現有什麼區別?
- 14. Spring中自動裝配與依賴注入有什麼區別?
- 15. IoC:依賴注入和程序集之間的整體實例
- 16. Dagger 2,依賴注入
- 17. 使用單例類和類與靜態方法有什麼區別?
- 18. 依賴注入實現簡單
- 19. 如何使用工作單元實例化依賴注入?
- 20. 單元測試依賴注入而不實際解析實例
- 21. 單例類中的私有靜態變量和私有實例變量有什麼區別?
- 22. 單例方法之間的區別
- 23. 如何使用實體框架上下文與依賴注入?
- 24. Angular2:實例級的依賴注入
- 25. 依賴注入的實際用例是什麼?
- 26. 爲什麼在單例類中實例成員是靜態的?
- 27. Dagger 2創建單例實例
- 28. 將靜態方法放入靜態類並將實例方法放入靜態類中有什麼區別?
- 29. 什麼樣的靜態類與單例的例子
- 30. Spring的ApplicationContext的靜態單例實例
我相信最壞的方法使用['enum'](http://stackoverflow.com/q/427902/2970947)。 – 2014-10-09 04:55:27