這篇文章主要介紹了java 中序列化與readResolve()方法的實例詳解的相關資料,這裡提供實例幫助大家理解這部分知識,需要的朋友可以參考下
java 中序列化與readResolve()方法的實例詳解
readResolve方法是什麼?這個方法跟物件的序列化相關(這樣倒是解釋了為什麼 readResolve方法是private修飾的)。 怎麼跟物件的序列化相關了?
以下我們先簡單回顧下物件的序列化。一般來說,一個類別實現了 Serializable接口,我們就可以把它往內存地寫再從內存裡讀出而"組裝"成一個跟原來一模一樣的對象。不過當序列化遇到單例時,裡邊就有了個問題:從記憶體讀出而組裝的物件破壞了單例的規則。單例是要求一個JVM中只有一個類別物件的,而現在透過反序列,一個新的物件克隆了出來。如下例所示:
Java程式碼:
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方法來回傳我們指定好的物件了,單例規則也就得到了保證。
以上是Java中序列化與readResolve()方法的使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!