2011-10-19 14 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

あなたが作成した直後に '新しいNameSurferEntry'を破棄しています。これは非常に疑わしいものです。 'findEntry'はどのように動作しますか?それは何を返すのですか? – Mat

+0

graph.update()は何をしますか? – aldrin

答えて

1

あなたが次の行に、データベースからの値で上書きする新しいNameSurferEntryを作成しています。返された項目が常に同じ場合、arraylistにはと同じオブジェクトへの参照のみが含まれます。あなたが考慮すべきである何

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

は、あなたのオブジェクトでimmutabilityを達成および/または守備のコピーを実行しようとしています。単純なプロパティの場合はfinalと宣言すれば十分ですが、複雑な要素の場合は通常、オブジェクトを新たに作成してコピーする必要があります。

次のサンプルでは、​​copy constructor

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

私はこれを前に追加しようとしましたが、db.findEntry()は、コンストラクタに必要な文字列ではなくNameSurferEntryオブジェクトを返します。 – megisto

+0

@megisto、あなたは**そのようなコンストラクタを実装するか、あるオブジェクトから別のオブジェクトにプロパティをコピーするための他の方法を実装する必要があります。 –

0

これはdb.findEntryは常に同じNameSurferEntryインスタンスを返すことを意味実装し、ちょうどそれが引数として受け取り、名前とその中に名前を置き換えることを考えると、あなたのために働く必要があります。

リストにオブジェクトを追加すると、リスト内のオブジェクトへの参照のみが追加されます。オブジェクトをコピーしてそのコピーをリストに格納するわけではありません。

なぜ、new NameSurferEntryを作成し、それを後でdb.findEntryの結果で上書きするのであれば、それをエントリ変数に割り当てるのはなぜですか?

entry = db.findEntry(name); 

が含まれており、一つのオブジェクトを返し、あなたはそれが含まれているものは何でも変更している

:これが何であれ

0

もっと明確にするには:リストに同じ参照を何度も追加して、参照先が1つのオブジェクトの内容を変更しています。

+0

それは私が "新しい" NameSurferEntryを追加しようとしていたので、私が思ったことです。 ArrayListに新しいオブジェクトを追加する方法がわかりません。 – megisto