1. 程式人生 > >《Effective Java》用私有構造器或者列舉型別強化SingleTon屬性

《Effective Java》用私有構造器或者列舉型別強化SingleTon屬性

我們耳熟能詳的單例有懶漢式、餓漢式等
例如下面這段的餓漢式

用private修飾構造方法,防止外界通過無參的構造方法直接建立物件,但是這樣還是可以通過反射來攻擊,造成程式碼的不安全,可以考慮設定一個變數,在建立第二個物件的時候丟擲一個自定義的異常。

這樣就安全了嗎?
如果我將這個物件序列化到本地,然後再反序列化回來,這個物件還是原來的物件嗎?不是的,這時可以考慮使用序列化的hock函式readResolve()來解決,當反序列化時,就會自動呼叫這個 readResolve方法來返回我們指定好的物件,如下圖

還有一種非常簡潔的方式,通過列舉實現單例

Single就是要實現單例的類,通過SingeltonEnum.INSTANCE.getInstance()建立單例物件,列舉實際上是一種語法糖,反編譯後會發現是由靜態方法和匿名內部類組成。

總結:單例的實現有很多種,還有double-check,同步方法等方式實現,在這裡不一一贅述,在effective java中作者強烈推薦列舉來實現高效安全的單例,不會被反射和序列化攻擊所困擾。