मैं आज एक दिलचस्प (और बहुत ही निराशाजनक) मुद्दे के साथ भाग गया, equals()जिसके कारण मुझे लगा कि दुर्घटनाग्रस्त होने के लिए एक अच्छी तरह से जांची जाने वाली कक्षा है और बग को ट्रैक करने में मुझे बहुत समय लगा।
पूर्णता के लिए, मैं एक आईडीई या डिबगर का उपयोग नहीं कर रहा था - बस अच्छे पुराने जमाने के टेक्स्ट एडिटर और सिस्टम.आउट्स। समय बहुत सीमित था और यह एक स्कूल परियोजना थी।
किसी भी तरह -
मैं एक बुनियादी खरीदारी की टोकरी जो एक हो सकता है विकसित कर रहा था ArrayListकी Bookवस्तुओं । आदेश लागू करने के लिए addBook(), removeBook()और hasBook()गाड़ी के तरीकों, मैं अगर जाँच करने के लिए चाहता था Bookपहले से ही अस्तित्व में Cart। इसलिए मैं जाता हूँ -
public boolean equals(Book b) {
... // More code here - null checks
if (b.getID() == this.getID()) return true;
else return false;
}
सभी परीक्षण में ठीक काम करता है। मैं 6 ऑब्जेक्ट बनाता हूं और उन्हें डेटा से भरता हूं। कई Cartकाम करता है , हटाता है, () पर काम करता है और सब कुछ ठीक काम करता है। मैंने पढ़ा कि आप या तो होequals(TYPE var)equals(Object o) { (CAST) var } सकते हैं या यह मान लें कि चूंकि यह काम कर रहा था, इसलिए यह बहुत ज्यादा मायने नहीं रखता था।
तब मैं कोई समस्या हुई थी - मैं एक बनाने के लिए आवश्यक Bookके साथ वस्तु केवलID बुक वर्ग के भीतर से उस में। इसमें कोई अन्य डेटा दर्ज नहीं किया जाएगा। मूल रूप से निम्नलिखित हैं:
public boolean hasBook(int i) {
Book b = new Book(i);
return hasBook(b);
}
public boolean hasBook(Book b) {
// .. more code here
return this.books.contains(b);
}
अचानक, equals(Book b)विधि अब काम नहीं करती है। यह एक अच्छा डीबगर के बिना नीचे ट्रैक करने के लिए एक बहुत लंबा समय लगा और Cartवर्ग को ठीक से परीक्षण और सही मान लिया गया। equals()निम्नलिखित के लिए विधि को स्वैप करने के बाद:
public boolean equals(Object o) {
Book b = (Book) o;
... // The rest goes here
}
सब कुछ फिर से काम करने लगा। क्या कोई कारण है कि विधि ने पुस्तक पैरामीटर को नहीं लेने का फैसला किया, भले ही यह स्पष्ट रूप से एक Bookवस्तु थी? एकमात्र अंतर यह प्रतीत होता था कि यह एक ही वर्ग के भीतर से तात्कालिक था, और केवल एक डेटा सदस्य से भरा था। मैं बहुत भ्रमित हूं। कृपया, कुछ प्रकाश डाला?