最近看effecitve java 2中有一段關於readResolve的使用,經過上網查閱資料得到以下總結:
我們知道java 對象的序列化操作是實現Serializable接口,我們就可以把它往內存地寫再從內存裏讀出而"組裝"成一個跟原來一模一樣的對象. 但是當我們遇到單例序列化的時候,就出現問題了。當從內存讀出而組裝的對象破壞了單例的規則,會創建新的對象。單例要求JVM只有一個對象,而通過反序化時就會產生一個克隆的對象,這就打破了單例的規則。
public class Elvis implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private static Elvis elv = new Elvis();
private Elvis(){
}
public static Elvis getInstance(){
return elv;
}
}
當把 Elvis 對象(通過getInstance方法獲得的那個單例對象)序列化後再從內存中讀出時, 就有一個全新但跟原來一樣的Elvis 對象存在了. 那怎麼來維護單例模式呢?這就要用到readResolve方法了. 如下所示:
public class Elvis implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private static Elvis elv = new Elvis();
private Elvis(){
}
public static Elvis getInstance(){
return elv;
}
//readResolve method to preserve singleton property
private Object readResolve(){
/**
* Return the one ture Elvis and let the garbage collector
* take care of the Elvis impersonator
*/
return elv;
}
}
這樣當JVM從內存中反序列化地"組裝"一個新對象時,就會自動調用這個 readResolve方法來返回我們指定好的對象了, 單例規則也就得到了保證.