[इस लेखन के समय, तीन अन्य उत्तर पोस्ट किए गए थे।]
दोहराने के लिए, मेरे प्रश्न का उद्देश्य यह पुष्टि करने के लिए परीक्षणों के मानक मामलों को खोजना है hashCodeऔर equalsएक-दूसरे के साथ सहमत हैं। इस प्रश्न के लिए मेरा दृष्टिकोण प्रोग्रामर द्वारा उठाए गए सामान्य रास्तों की कल्पना करना है, जब प्रश्न में कक्षाएं लिखी जाती हैं, अर्थात् अपरिवर्तनीय डेटा। उदाहरण के लिए:
equals()बिना लिखे लिखा hashCode()। इसका मतलब अक्सर समानता को दो उदाहरणों के क्षेत्रों की समानता के रूप में परिभाषित किया गया था।
hashCode()बिना लिखे लिखा equals()। इसका मतलब यह हो सकता है कि प्रोग्रामर एक अधिक कुशल हैशिंग एल्गोरिथ्म चाह रहा था।
# 2 के मामले में, समस्या मुझे कोई भी नहीं लगती है। कोई अतिरिक्त उदाहरण नहीं बनाए गए हैं equals(), इसलिए किसी भी अतिरिक्त उदाहरण के लिए समान हैश कोड की आवश्यकता नहीं है। सबसे खराब रूप से, हैश एल्गोरिथ्म हैश मानचित्रों के लिए खराब प्रदर्शन प्राप्त कर सकता है, जो इस प्रश्न के दायरे से बाहर है।
# 1 के मामले में, मानक इकाई परीक्षण एक ही वस्तु के दो उदाहरणों को बनाने के लिए मजबूर करता है, समान डेटा के साथ कंस्ट्रक्टर को पास किया जाता है, और समान हैश कोड को सत्यापित करता है। झूठे सकारात्मक के बारे में क्या? कंस्ट्रक्टर मापदंडों को चुनना संभव है, जो कि एक गैर-अनसाउथ एल्गोरिथ्म पर समान हैश कोड उत्पन्न करने के लिए होता है। इस तरह के मापदंडों से बचने के लिए एक इकाई परीक्षण इस प्रश्न की भावना को पूरा करेगा। यहां शॉर्टकट के लिए स्रोत कोड का निरीक्षण equals()करना, कठिन सोचना, और उसके आधार पर एक परीक्षण लिखना है, लेकिन जब कुछ मामलों में यह आवश्यक हो सकता है, तो सामान्य परीक्षण भी हो सकते हैं जो सामान्य समस्याओं को पकड़ते हैं - और ऐसे परीक्षण भी भावना को पूरा करते हैं इस सवाल का।
उदाहरण के लिए, यदि परीक्षण किए जाने वाले वर्ग (इसे डेटा कहते हैं) में एक कंस्ट्रक्टर होता है, जो एक स्ट्रिंग लेता है, और स्ट्रिंग्स से निर्मित ऐसे equals()उदाहरण हैं जो उकसाए गए उदाहरण हैं equals(), तो एक अच्छा परीक्षण संभवतः परीक्षण करेगा:
new Data("foo")
- एक और
new Data("foo")
हम भी हैश कोड की जाँच कर सकते हैं new Data(new String("foo")), स्ट्रिंग को नजरअंदाज नहीं करने के लिए मजबूर करने के लिए, हालांकि यह एक सही हैश कोड Data.equals()उपज की तुलना में अधिक है, मेरी राय में, एक सही परिणाम प्राप्त करने के लिए है।
एली कोर्टराइट का जवाब equalsविनिर्देशन के ज्ञान के आधार पर हैश एल्गोरिथ्म को तोड़ने के तरीके से कठिन सोचने का एक उदाहरण है । एक विशेष संग्रह का उदाहरण एक अच्छा है, जैसा कि उपयोगकर्ता द्वारा निर्मित Collectionसमय पर बदल जाता है, और हैश एल्गोरिथ्म में muckups के लिए काफी प्रवण हैं।