1. 程式人生 > >對readResolve的一點認識

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

相關推薦

軟體一點認識.

微軟認為軟體就是一種服務. 我認為軟體是一種讓我們怎樣更好的使用工具的思路和方法.更是解決複雜問題的解決方案(凡是邏輯能完成的問題). 史學家講人與動物的區別在於會使用工具.比如,語言..語言是種抽象化的工具.而現代的工具的到來(比如計算機等各種電子工具),也帶來一個問題就是

HashMap一點認識

HashMap其實和Hashtable很像,僅有HashMap是執行緒不安全的和允許鍵值對為空這兩個不同。HashMap是無序的。 以下是原始碼裡面的解釋,  implementation provides all of the optional map operation

readResolve一點認識

      最近看effecitve java 2中有一段關於readResolve的使用,經過上網查閱資料得到以下總結:       我們知道java 物件的序列化操作是實現Serializable介面,我們就可以把它往記憶體地寫再從記憶體裡讀出而"組裝"成一個跟原來一模

抽象類和接口的一點認識

數據共享 父類 標識 常量 詳細 class 抽象層 span 必須 假設一個非抽象子類繼承一個抽象父類,它必須實現父類中的抽象方法,假設子類也是抽象類,那麽則不必實現父類中的抽象方法。 假設一個類實現了一個接口。那麽必須實現接口中的全部方法。可是子類是抽象類則不用。

fragment的一點認識

fragment 更多 認識 nbsp 復用性 div 業務 多個 組件化 一切都是為了組件化和復用 View的可復用性導致View的設計不能承載更多視圖外的邏輯。Fragment可以承載多個View和一定的業務邏輯。Activity太重導致無法更細粒度的復用,卻可以承載

BFC的一點認識

caption image 分享圖片 sca gin open 單元格 name div 首先讓我復習一下塊級元素(block)和內聯元素(inline) 塊元素(block)的特點: block元素會獨占一行,多個block元素會各自新起一行。默認情況下,block元素

寫一下自己《統計學習方法》的一點認識

決策 kmeans 統計學習方法 回歸 增加 imp 方法 樸素貝葉斯 -- 一提到機器學習,就不得不提李航的這本《統計學習方法》,回家這幾日,把這本書的前九章看完了,因為後面兩章HMM和CRF在之前就已經看過了,簡單寫一下自己的一點新認識。 這本書基本上是在圍繞有監督

分而治之演算法的一點認識

其實就是把打的問題轉化為小的問題,小的問題解決了打的問題自然就解決了,這一聽就像是遞迴,沒錯就是遞迴。比較經典的有:漢諾塔,八皇后,歸併排序了,等等。我就不列出程式碼了,網上多的是。關鍵是將大的問題轉化為小的問題,這種思想。其實再將問題分解以後,小的物件面臨的問題的本質和大的物件面臨問題的本質是一樣的。只是數

生信與計算生物的一點認識[轉載]

轉自:https://baike.baidu.com/tashuo/browse/content?id=4ca32cfeca217b053440f64e&lemmaId=&fromLemmaModule=pcBottom 1.數學將重塑生物學  引入統計和資料分析。例子:如何理解

嵌入式的一點認識

有人說嵌入式是啥,不就是微控制器麼。嵌入式還真沒這麼“膚淺”,下面是我瞭解的一些關於嵌入式的知識。 嵌入式是什麼,簡單來說,嵌入式是在已有的硬體平臺上移植作業系統。那麼問題又來了,為什麼要移植作業系統呢?根據我所學的知識,我覺得有以下幾點好處: 1.提高軟體的移植性。傳統微

深淺拷貝的一點認識

C++初學—拷貝建構函式—深淺拷貝—簡單認識 這學期開了C++課程,上課不認真聽課的我,選擇敲下老師課件中所有程式碼來學習,到建構函式模組認識了有個叫做“拷貝建構函式”的東西,其中深淺拷貝令我感到困惑,在上網查閱了相關資料以及讀過各博主的博文之後,有感想體會如

Final的一點認識

對Final的一點認識在程式設計的過程中,我們總是會遇到final關鍵字,那麼我們對final怎麼理解呢,下面是我的一點粗淺認識,和大家共享。package zy.pro.jbd.demo;public

虛擬函式動態繫結的一點認識

因為行內函數常常可以提高程式碼執行的速度,因此很多普通函式會根據情況進行內聯化,但是虛擬函式無法利用內聯化的優勢,這是因為行內函數是在“編譯期”編譯器將呼叫行內函數的地方用行內函數體的程式碼代替(內聯展開),但是虛擬函式本質上是“執行期”行為,本質上在“編譯期”編譯器無法知道某處的虛擬函式呼叫在真正執行的時候

maven的一點認識

使用maven好處: 在maven最普通的應用是在jar的管理上,這樣最明顯的好處是讓jar 和source分開,jar放置私服的maven倉庫,source放置SVN. 從SVN匯出專案原始碼時就只有source 了,這樣可以少佔有網路資源(從SVN匯出專案時會很快),同時

c&c++原始檔和標頭檔案分開的好處的一點認識

對c&c++程式來說,基本上來說都是要把原始檔和標頭檔案分別編寫。一般都是代表一個基本功能的原始檔引用相應的標頭檔案。一個 相關功能的模組可能有若干對原始檔和標頭檔案組成。這是基於元件程式設計的核心。在我看來,他的好處是巨大的,是java不可比擬的,也是不可複製的:c

Cookie的一點認識

1. Cookie是怎麼在伺服器和瀏覽器之間傳遞的?(以Tomcat為參考) response.addCookie()將cookie寫到客戶端 request.getCookies()獲取瀏覽器端的cookie 但底層是怎麼實現的?檢視一下Tomcat的原始碼得知: 原來是把

面向物件機制一點認識

面向物件機制是一種觀察應用程式的方式.利用面向物件方法,把應用程式分成許多小塊(或物件),這些物件是相互獨立的.然後可以組合這些物件.建立應用程式.可以把它看到砌磚牆.第一步要建立或購買基本物件(各種磚塊).有了磚塊後.

ContentProvider的一點認識

1、ContentProvider 是android的四大元件之一,作用是對外共享資料,就是把自已應用程式裡的資料分享給其他應用程式,其他應用可以通過ContentProvider對你應用中的資料進行添刪改查。使用ContentProvider對外共享資料

Oracle表分割槽的一點認識

 Oracle的表分割槽功能通過改善可管理性、效能和可用性,從而為各式應用程式帶來了極大的好處。通常,分割槽可以使某些查詢以及維護操作的效能大大提高。此外,分割槽還可以極大簡化常見的管理任務,分割槽是構建千兆位元組資料系統或超高可用性系統的關鍵工具。       分割槽功能能

w3wp.exe的一點認識!

  很想看一個網站的內容,但是這個網站沒有RSS,還得整天的去打這個網站!感覺比較鬱悶,正好今天有時間,你不能提供訂閱,我自己來生成RSS,自己來搞定訂閱的問題. 實現這個功能的思路比較簡單:獲取該網址的Html原始碼,通過正則表示式過濾出有用的資料,將這些有用的資料生成