單例,靜態工廠,構造器
阿新 • • 發佈:2018-12-26
1.effective in java 第一條,儘量用靜態方法代替構造器
1.靜態工廠不必每次都建立新物件。 如Boolean.valueof(boolean)
## 例項受控的類,確保是singleton(單例),或者是不可例項化的。
單例 singleton 僅被例項化一次的類,
注意確保如下幾點
singleton構造方法必須私有,使得無法通過new來生成第二個例項,
確保物件僅有一個,尤其在多執行緒下用到靜態工廠方法
確保反序列化時不會重新建立物件。
多種方法編寫單例類物件 (餓漢單例模式)
1. // 靜態工廠方法 單例方法1 餓漢單例模式 private static final SingleInstance s = new SingleInstance(); public static SingleInstance getInstance() { return s; }
//公有的靜態域直接返回單例的物件
2. 靜態工廠懶漢模式
// 懶漢模式
private static SingleInstance sss;
// 加鎖後導致不必要資源浪費,每次都同步
public synchronized static SingleInstance get() {
if (sss == null) {
sss = new SingleInstance();
}
return sss;
}
3. DLC靜態工廠方法,舉個標準用法,ImageLoader原始碼裡的
private volatile static ImageLoader instance; /** * Returns singleton class instance */ public static ImageLoader getInstance() { if (instance == null) { synchronized (ImageLoader.class) { if (instance == null) { instance = new ImageLoader(); } } } return instance; }
//程式碼裡通過2次判空來同步必要的情況
// 由於記憶體模型,靜態工廠方法多執行緒情況下也會有問題,即使用了雙重鎖定也一樣
所以加上修飾符:
volatile 是1.5後優化JAVA記憶體模型的關鍵字,DLC標準寫法如上,ImageLoader內部就是如此
3. java1.5後可以通過列舉
上述幾種情況在反序列化時重新生成物件。只有列舉不會。
4.靜態內部類 推薦
5.hashmap裡的單例