ToStringBuilder学习(三):readResolve()方法与序列化
在ToStringBuilder學習(一)中提到一個問題,即 readResolve方法是干啥的? 當時也沒多想, 只是列在那里, 今天忙里偷閑地把搜點材料整理下這個問題.
原來這個方法跟對象的序列化相關(這樣倒是解釋了為什么 readResolve方法是private修飾的). ??? 怎么跟對象的序列化相關了?
下面我們先簡要地回顧下對象的序列化. 一般來說, 一個類實現了 Serializable接口, 我們就可以把它往內存地寫再從內存里讀出而"組裝"成一個跟原來一模一樣的對象. 不過當序列化遇到單例時,這里邊就有了個問題: 從內存讀出而組裝的對象破壞了單例的規則. 單例是要求一個JVM中只有一個類對象的, 而現在通過反序列化,一個新的對象克隆了出來.
如下例所示:
public final class MySingleton implements Serializable {
???? private MySingleton() { }
???? private static final MySingleton INSTANCE = new MySingleton();
???? public static MySingleton getInstance() { return INSTANCE; }
}
當把 MySingleton對象(通過getInstance方法獲得的那個單例對象)序列化后再從內存中讀出時, 就有一個全新但跟原來一樣的MySingleton對象存在了. 那怎么來維護單例模式呢?這就要用到readResolve方法了. 如下所示:
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;
?? }
}
這樣當JVM從內存中反序列化地"組裝"一個新對象時,就會自動調用這個 readResolve方法來返回我們指定好的對象了, 單例規則也就得到了保證.
---------------------------------
上面用的例子來源于這個鏈接:http://www.javalobby.org/java/forums/t17491.html, 另這個鏈接中還有一個更為高級的例子, 如有興趣可去一看.
博客元地址:http://rmn190.iteye.com/blog/350193
?
轉載于:https://www.cnblogs.com/kabi/p/5182837.html
總結
以上是生活随笔為你收集整理的ToStringBuilder学习(三):readResolve()方法与序列化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 5.0中新增特性
- 下一篇: C++计算几何库