2010-03-22 23 views

回答

7

不幸的是,沒有可靠的方法來對矢量對象進行深層複製。

只是快速回顧一下我認爲「深層複製」的含義:深層複製是一個副本,其中不僅複製了一個集合的內容(在本例中爲矢量),而且包含在Vector中的對象被獨立複製。換句話說:如果向量V包含A,並且創建了V的副本(V'),則V'中的A(A')的副本不受A的任何更改影響,反之亦然。

通常,這將通過「克隆」一個對象來實現。不幸的是,如果你無法控制Vector中的對象,那麼你沒有合理的方法克隆它們,特別是因爲JavaME沒有擁有Cloneable接口(據我所知)。當然,如果你確實控制了對象,你可以創建自己的Cloneable接口,該接口指定一個clone()方法,該方法返回一個完全獨立的對象副本。然後,您必須確保您的特殊克隆Vector只接受實現該接口的對象。從那裏,你可以很容易地(代碼方式)製作一個可以克隆自己的Vector。

+0

唉,那就是我所害怕的。謝謝。 – 2010-03-23 11:26:27

+0

我可以實現一個可克隆的接口,但它不會像J2ME本地的那麼快。 – 2010-03-23 11:27:02

2

你將需要複製你的向量的內容與循環。

Enumeration e = projects.elements(); 
while (e.hasMoreElements()) { 
    this.projects.addElement((Project) e.nextElement()); 
} 

需要更多信息請參見The Java Forum第2頁回覆18,答案就在那裏。

+0

即確實每個元件的淺表副本。 – 2010-03-22 18:40:58

+0

@DanG這是你在J2ME中可以獲得的最好的東西,你是否還要閱讀Vector Docs? http://en.wikipedia.org/wiki/Object_copy#Deep_vs._Shallow_vs._Lazy_copy如果我正確讀取了我給出的代碼是深層複製,因爲這兩個向量是獨立的。 – 2010-03-22 18:58:46

+0

一個完整的深拷貝將複製每個子元素和每個子子元素,依此類推。任何時候都不應複製對象引用;總是每個領域的副本。由於您正在複製元素的對象引用,因此這是該級別的淺拷貝。 – 2011-06-13 13:32:07

4

由於您將此標籤標記爲BlackBerry,而不僅僅是J2ME,因此應該提及有一個CloneableVector類是BlackBerry API的一部分。如果你試圖堅持嚴格的J2ME,這將是沒用的。但是,如果您只是針對BlackBerry,那麼它就能滿足您的需求。

net.rim.device.api.util.CloneableVector documentation

+0

這僅是5.0版本。現在5.0上沒有太多的設備。 – 2010-03-23 14:56:41

+0

事實並非如此,至少在4.6以上,我不想再回頭檢查它什麼時候出現。我碰巧指向5.0文檔。 – Fostah 2010-03-23 15:57:04

+0

我在4.3工作... – 2010-03-24 19:18:10