2014-10-09 42 views

回答

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

這種方法在功能上等同於公共領域的做法,但它 更加簡潔,免費提供系列化機械,並提供了一個 切實保證針對多個實例化,即使在面對複雜的序列化或反射攻擊時也是如此。

雖然這種方法尚未被廣泛採用,但單元素枚舉類型是實現單例的最佳方式。

相關問題