對readResolve的一點認識

      最近看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方法來返回我們指定好的對象了, 單例規則也就得到了保證.


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章