Bu sorunun iki tipik nedeni vardır:
Statik Alanlar
Listenizdeki nesneler verileri statik alanlarda depoluyorsa, listenizdeki her nesne aynı değerleri taşıdıkları için aynı görünecektir. Aşağıdaki sınıfı düşünün:
public class Foo {
private static int value;
public Foo(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
Bu örnekte, bildirildiği için int value
tüm örnekler arasında paylaşılan yalnızca bir tane var . ( "Sınıf Üyelerini Anlama" eğiticisine bakın.)Foo
static
Foo
Aşağıdaki kodu kullanarak bir listeye birden çok nesne eklerseniz , her örnek 3
bir çağrıdan şuna geri dönecektir getValue()
:
for (int i = 0; i < 4; i++) {
list.add(new Foo(i));
}
Çözüm basit - static
değerlerin gerçekten o sınıfın her örneği arasında paylaşılmasını istemiyorsanız, sınıfınızdaki alanlar için anahtar kelimeleri kullanmayın .
Aynı Nesneyi Eklemek
Bir listeye geçici bir değişken eklerseniz, her döngüde eklediğiniz nesnenin yeni bir örneğini oluşturmanız gerekir. Aşağıdaki hatalı kod pasajını düşünün:
List<Foo> list = new ArrayList<Foo>();
Foo tmp = new Foo();
for (int i = 0; i < 3; i++) {
tmp.setValue(i);
list.add(tmp);
}
Burada tmp
nesne döngünün dışında oluşturulmuştur. Sonuç olarak, aynı nesne örneği listeye üç kez ekleniyor. Örnek değeri tutacaktır 2
, çünkü son çağrı sırasında aktarılan değer buydu setValue()
.
Bunu düzeltmek için, nesne yapısını döngünün içine taşıyın:
List<Foo> list = new ArrayList<Foo>();
for (int i = 0; i < 3; i++) {
Foo tmp = new Foo();
tmp.setValue(i);
list.add(tmp);
}