天天看點

使用枚舉實作絕對單例

單例模式是開發中用的最多的設計模式之一,在諸如資料庫連接配接池、配置檔案讀取等業務場景廣泛使用。單例的Java實作大家都知道有兩種方式,最初的英文文檔翻譯者為其起了很有趣的名字:“懶漢式”和“餓漢式”,當然還包括這兩種方式的其他變種,比如增加了相關線程安全的同步鎖,但即使這樣也不能實作絕對意義上的Singleton ,因為Java本身的反射機制可以繞過構造方法生成對象,即使你把構造方法變成了Private。

Java1.5之後,随着枚舉類型的加入,單例多了一個實作方法,(包含單個元素的枚舉類型):

public enum Elvis {
        INSTANCE;
        public void leaveTheBuilding() {

        }
    }
           
優勢:
  • 無償提供序列化;
  • 絕對防止多次執行個體化;
  • 防反射,這樣就沒辦法反射生成對象了;
  • 簡潔明了;
單元素的枚舉類型本應該成為單例模式的最佳實作方式,隻可惜這種方式在現實開發中很少被使用。