我知道,爲了複製一個數組列表並且有兩個彼此獨立的列表,你必須使用一個深層副本(將對象從一個列表複製到另一個列表中,而不僅僅是引用),但是有沒有一種方法可以跨越-類?如何在Java中將陣列列表從一個類複製到另一個類?
例如;我從Class1調用Class2。在事件發生時,Class2對象被添加到自定義對象的ArrayList中。我想能夠將此ArrayList傳遞給Class1,但每當我嘗試獲取NullPointer時。
任何線索?
我知道,爲了複製一個數組列表並且有兩個彼此獨立的列表,你必須使用一個深層副本(將對象從一個列表複製到另一個列表中,而不僅僅是引用),但是有沒有一種方法可以跨越-類?如何在Java中將陣列列表從一個類複製到另一個類?
例如;我從Class1調用Class2。在事件發生時,Class2對象被添加到自定義對象的ArrayList中。我想能夠將此ArrayList傳遞給Class1,但每當我嘗試獲取NullPointer時。
任何線索?
我的建議是讓你創建一個getArray()方法並從另一個類中調用它。這個方法應該創建一個ArrayList的副本,因爲你不應該在類中「傳遞」變量;總是使用get()方法,所以OO範例保持不變。
做這樣的事情:
1級
public ArrayList<Object> getArray() {
ArrayList<Object> aux = new ArrayList<Object>();
for(Object x : list) //object is the string, int, etc...
aux.add(x.clone()) //assuming the Object has a clone method!
return aux;
}
在2級,只需要調用此方法。然後看看關於空例外的其他答案的測試,應該可以工作。 希望它有幫助。
也請解釋如何「複製價值」,因爲那是困難的部分。 – Thilo 2010-02-05 02:01:11
不要返回列表!返回它的副本,否則你會讓我搞亂同一個對象!代碼的其餘部分是沒問題的。 @cletus – simaofreitas 2010-02-05 02:03:08
就像這樣。我編輯了原文。 – simaofreitas 2010-02-05 02:06:44
這是高度指示設計缺陷。
看看你是否無法通過在列表中包裝列表來共享類並使用它來控制對列表的訪問來實現相同的目標。
唯一的情況下,這不僅僅是徹底的工作是如果你的兩個類必須獨立修改列表。
如果這是一個要求,那麼我可能會將包裝類的不同實例交給每個修改類(引用同一個源列表),然後有一種方法可以爲新添加的數據添加標籤ID引用原始類 - 以這種方式查詢時,包裝將僅返回未標記的項目(原始共享列表的一部分項目)以及使用其自己的標識標記的項目。
無論是包裝類還是包裝類都可以包含第二個列表,並且在查詢時返回原始列表和第二個列表的組合結果。
我幾乎從不想要一個深層複製。它發生了,但它非常罕見。
如果您發佈更多信息,也許我們可以更具體地幫助重新設計。
ALSO:(編輯) 有可能是複製的數組列表不是你的問題 - 它可能不是真正的深拷貝。對於深層拷貝來說,這意味着你實現了一個拷貝方法(我相信它們應該被稱爲.clone(),我從來沒有使用過這些東西 - 就像我說的那樣,對於數組列表中的每個對象都是不好的),那麼你可以調用你的複製方法來獲得下一個列表中的新副本。
此外,複製對象引用的任何對象也應該被克隆。 「深」意味着一直沿着樹。
我猜你在這個過程中的某個地方失敗了。
我真的很想聽聽爲什麼你覺得你需要一個副本而不是參考。
請發佈您的密碼。兩個班。 – duffymo 2010-02-05 01:58:33
我想知道有兩個類以這種方式共享數據列表的設計。只有一個班級應該擁有它。你爲什麼要這樣做?請解釋。 – duffymo 2010-02-05 01:59:43