使用枚舉實現的單例模式,不但可以防止利用反射強行構建單例對象,而且可以在枚舉類對象被反序列化的時候,保證反序列的返回結果是同一對象。
對於其他方式實現的單例模式,如果既想要做到可序列化,又想要反序列化為同一對象,則必須實現readResolve方法。
一般來說, 一個類實現了 Serializable接口, 我們就可以把它往內存地寫再從內存里讀出而"組裝"成一個跟原來一模一樣的對象.
不過當序列化遇到單例時,這里邊就有了個問題: 從內存讀出而組裝的對象破壞了單例的規則. 單例是要求一個JVM中只有一個類對象的, 而現在通過反序列化,一個新的對象克隆了出來,與以前序列化的對象不能equlas。
單例模式code:
package com.qhong.designmodel.single; public final class MySingleton { private MySingleton() { } private static final MySingleton INSTANCE = new MySingleton(); public static MySingleton getInstance() { return INSTANCE; } }
反序列化出同一個對象:
package com.qhong.designmodel.single; import java.io.ObjectStreamException; import java.io.Serializable; public final class MySingleton implements Serializable { private MySingleton() { } private static final MySingleton INSTANCE = new MySingleton(); public static MySingleton getInstance() { return INSTANCE; } private Object readResolve() throws ObjectStreamException { // instead of the object we're on, // return the class variable INSTANCE return INSTANCE; } }
http://blog.163.com/hsh8523%40126/blog/static/218935592010520255261/