2011-10-19 63 views
0

我有一個ArrayList,我正在添加對象。對象通過使用文本框添加。Java引用ArrayList

我遇到的問題是,當用戶在文本框中輸入一個值時,我的ArrayList中的所有條目都將採用新值。

if(e.getSource() == textbox){ 
     String name = textbox.getText();    
     NameSurferEntry entry = new NameSurferEntry(); 
     entry = db.findEntry(name); 
     graph.addEntry(entry); 
     graph.update(); 
     textbox.setText(""); 

    } 

代碼中添加條目:

public void addEntry(NameSurferEntry entry) {  
    entryArray.add(entry);   
    } 
+0

從發佈的代碼,它會很難幫助,雖然我會懷疑'db.findEntry()'方法。你創建一個新的'NameSurferEntry'然後立即覆蓋它的事實也是不常見的。 –

+0

您在創建它時會立即丟棄您的'New NameSurferEntry',這非常可疑。 findEntry如何工作?它返回什麼? – Mat

+0

graph.update()做什麼? – aldrin

回答

1

你正在創建一個新的NameSurferEntry你的下一行從您的數據庫中的值覆蓋。如果返回的條目總是相同,則您的數組列表將只包含對相同對象的引用。

NameSurferEntry entry = new NameSurferEntry(); 
entry = db.findEntry(name); 

你應該考慮什麼是努力實現在你的對象immutability和/或執行防守複製。對於簡單的屬性,只需聲明它們就足夠了,但對於複雜的元素,通常需要通過重新創建對象來複制對象。

下面的例子應該爲你工作,因爲你實現copy constructor

NameSurferEntry copy = new NameSurferEntry(db.findEntry(name)); 
+0

我曾嘗試在之前添加,但db.findEntry()返回一個NameSurferEntry對象而不是構造函數所需的字符串。 – megisto

+0

@megisto,你必須**實現**這樣的構造函數,或者實現一些其他方式來將屬性從一個對象複製到另一個對象。 –

0

這意味着db.findEntry總是返回相同的NameSurferEntry實例,只是取代了名字裏面有它接收的參數名稱。

將對象添加到列表僅添加對列表中對象的引用。它不克隆該對象以將其副本存儲在列表中。

順便說一句,你爲什麼要創建一個new NameSurferEntry並將其賦值給入口變量,如果只是用db.findEntry之後的結果覆蓋它呢?

0

無論是這樣的:

entry = db.findEntry(name); 

包含並返回一個對象,你改變什麼它包含。

更加清楚:您一次又一次地向列表添加相同的引用,並更改引用點的單個對象的內容。

+0

這就是我想的,所以我試圖添加一個「新」NameSurferEntry。我不知道如何添加一個新的對象到ArrayList。 – megisto