[摘選]Java中如何操作和保存對象?

 

Java中如何操作和保存對象?

 --------摘自《Thinking in Java》第二章

2.1 用句柄操縱對象
每種編程語言都有自己的數據處理方式。有些時候,程序員必須時刻留意準備處理的是什麼類型。您曾利用一些特殊語法直接操作過對象,或處理過一些間接表示的對象嗎(CC++裏的指針)?
所有這些在Java裏都得到了簡化,任何東西都可看作對象。因此,我們可採用一種統一的語法,任何地方均可照搬不誤。但要注意,儘管將一切都看作對象,但操縱的標識符實際是指向一個對象的句柄Handle)。在其他Java參考書裏,還可看到有的人將其稱作一個引用,甚至一個指針。可將這一情形想象成用遙控板(句柄)操縱電視機(對象)。只要握住這個遙控板,就相當於掌握了與電視機連接的通道。但一旦需要換頻道或者關小聲音,我們實際操縱的是遙控板(句柄),再由遙控板自己操縱電視機(對象)。如果要在房間裏四處走走,並想保持對電視機的控制,那麼手上拿着的是遙控板,而非電視機。
此外,即使沒有電視機,遙控板亦可獨立存在。也就是說,只是由於擁有一個句柄,並不表示必須有一個對象同它連接。所以如果想容納一個詞或句子,可創建一個String句柄:
String s;
但這裏創建的只是句柄,並不是對象。若此時向s發送一條消息,就會獲得一個錯誤(運行期)。這是由於s實際並未與任何東西連接(即沒有電視機)。因此,一種更安全的做法是:創建一個句柄時,記住無論如何都進行初始化:
String s = "asdf";
然而,這裏採用的是一種特殊類型:字串可用加引號的文字初始化。通常,必須爲對象使用一種更通用的初始化類型。

   2.2
所有對象都必須創建
創建句柄時,我們希望它同一個新對象連接。通常用new關鍵字達到這一目的。new的意思是:把我變成這些對象的一種新類型。所以在上面的例子中,可以說:
String s = new String("asdf");
它不僅指出將我變成一個新字串,也通過提供一個初始字串,指出了如何生成這個新字串
當然,字串(String)並非唯一的類型。Java配套提供了數量衆多的現成類型。對我們來講,最重要的就是記住能自行創建類型。

 

2.2.1 保存到什麼地方
程序運行時,我們最好對數據保存到什麼地方做到心中有數。特別要注意的是內存的分配。有六個地方都可以保存數據:
(1)
寄存器。這是最快的保存區域,因爲它位於和其他所有保存方式不同的地方:處理器內部。然而,寄存器的數量十分有限,所以寄存器是根據需要由編譯器分配。我們對此沒有直接的控制權,也不可能在自己的程序裏找到寄存器存在的任何蹤跡。
(2)
堆棧。駐留於常規RAM(隨機訪問存儲器)區域,但可通過它的堆棧指針獲得處理的直接支持。堆棧指針若向下移,會創建新的內存;若向上移,則會釋放那些內存。這是一種特別快、特別有效的數據保存方式,僅次於寄存器。創建程序時,Java編譯器必須準確地知道堆棧內保存的所有數據的長度以及存在時間。這是由於它必鬚生成相應的代碼,以便向上和向下移動指針。這一限制無疑影響了程序的靈活性,所以儘管有些Java數據要保存在堆棧裏——特別是對象句柄,但Java對象並不放到其中。
(3)
堆。一種常規用途的內存池(也在RAM區域),其中保存了Java對象。和堆棧不同,內存堆Heap)最吸引人的地方在於編譯器不必知道要從堆裏分配多少存儲空間,也不必知道存儲的數據要在堆裏停留多長的時間。因此,用堆保存數據時會得到更大的靈活性。要求創建一個對象時,只需用new命令編制相關的代碼即可。執行這些代碼時,會在堆裏自動進行數據的保存。當然,爲達到這種靈活性,必然會付出一定的代價:在堆裏分配存儲空間時會花掉更長的時間!
(4)
靜態存儲。這兒的靜態Static)是指位於固定位置(儘管也在RAM裏)。程序運行期間,靜態存儲的數據將隨時等候調用。可用static關鍵字指出一個對象的特定元素是靜態的。但Java對象本身永遠都不會置入靜態存儲空間。
(5)
常數存儲。常數值通常直接置於程序代碼內部。這樣做是安全的,因爲它們永遠都不會改變。有的常數需要嚴格地保護,所以可考慮將它們置入只讀存儲器(ROM)。
(6)
RAM存儲。若數據完全獨立於一個程序之外,則程序不運行時仍可存在,並在程序的控制範圍之外。其中兩個最主要的例子便是流式對象固定對象。對於流式對象,對象會變成字節流,通常會發給另一臺機器。而對於固定對象,對象保存在磁盤中。即使程序中止運行,它們仍可保持自己的狀態不變。對於這些類型的數據存儲,一個特別有用的技巧就是它們能存在於其他媒體中。一旦需要,甚至能將它們恢復成普通的、基於RAM的對象。Java 1.1提供了對Lightweight persistence的支持。未來的版本甚至可能提供更完整的方案。

 

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