इस समस्या के दो विशिष्ट कारण हैं:
स्थैतिक क्षेत्र
यदि आपकी सूची में मौजूद वस्तुएं स्थिर क्षेत्रों में डेटा संग्रहीत करती हैं, तो आपकी सूची में प्रत्येक वस्तु समान दिखाई देगी क्योंकि वे समान मान रखती हैं। नीचे दिए गए वर्ग पर विचार करें:
public class Foo {
private static int value;
public Foo(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
उस उदाहरण में, केवल एक ही int value
है जो सभी उदाहरणों के बीच साझा किया जाता है Foo
क्योंकि यह घोषित किया जाता है static
। ( "कक्षा के सदस्यों को समझना" ट्यूटोरियल देखें।)
यदि आप Foo
नीचे दिए गए कोड का उपयोग करके एक सूची में कई ऑब्जेक्ट जोड़ते हैं, तो प्रत्येक उदाहरण 3
कॉल से वापस आ जाएगा getValue()
:
for (int i = 0; i < 4; i++) {
list.add(new Foo(i));
}
समाधान सरल है - static
जब तक आप वास्तव में उस वर्ग के हर उदाहरण के बीच साझा किए गए मूल्यों को नहीं चाहते हैं तब तक अपनी कक्षा में फ़ील्ड के लिए कीवर्ड का उपयोग न करें ।
एक ही वस्तु जोड़ना
यदि आप किसी सूची में एक अस्थायी चर जोड़ते हैं, तो आपको हर बार लूप होने वाली वस्तु का एक नया उदाहरण बनाना होगा। निम्नलिखित गलत कोड स्निपेट पर विचार करें:
List<Foo> list = new ArrayList<Foo>();
Foo tmp = new Foo();
for (int i = 0; i < 3; i++) {
tmp.setValue(i);
list.add(tmp);
}
यहाँ, tmp
लूप के बाहर ऑब्जेक्ट का निर्माण किया गया था। नतीजतन, तीन बार सूची में एक ही वस्तु उदाहरण जोड़ा जा रहा है। उदाहरण मान रखेगा 2
, क्योंकि अंतिम कॉल के दौरान पास किया गया मान था setValue()
।
इसे ठीक करने के लिए, बस लूप के अंदर ऑब्जेक्ट कंस्ट्रक्शन को स्थानांतरित करें:
List<Foo> list = new ArrayList<Foo>();
for (int i = 0; i < 3; i++) {
Foo tmp = new Foo();
tmp.setValue(i);
list.add(tmp);
}