किया गया है कुछ विचार विमर्श जेपीए संस्थाओं और जिसके बारे में यहां hashCode()
/equals()
कार्यान्वयन जेपीए इकाई वर्गों के लिए इस्तेमाल किया जाना चाहिए। उनमें से अधिकांश (यदि सभी नहीं) हाइबरनेट पर निर्भर करते हैं, लेकिन मैं उन पर चर्चा करना चाहूंगा जेपीए-कार्यान्वयन-न्यूट्रली (मैं एक्लिप्सलिंक का उपयोग कर रहा हूं, वैसे)।
सभी संभावित कार्यान्वयन के अपने फायदे और नुकसान हैं :
hashCode()
/equals()
अनुबंध अनुरूपता (अपरिवर्तनीयता) के लिएList
/Set
संचालन- चाहे समान हो ऑब्जेक्ट्स (जैसे विभिन्न सत्रों से, आलसी-लोड डेटा संरचनाओं से गतिशील प्रॉक्सी) का पता लगाया जा सकता है
- क्या निकाय अलग (या गैर-जारी) स्थिति में सही व्यवहार करते हैं
जहाँ तक मैं देख सकता हूँ, वहाँ तीन विकल्प हैं :
- उन्हें ओवरराइड न करें; भरोसा करो
Object.equals()
औरObject.hashCode()
hashCode()
/ यहequals()
काम- समान वस्तुओं की पहचान नहीं कर सकते, गतिशील परदे के पीछे की समस्याओं
- अलग संस्थाओं के साथ कोई समस्या नहीं है
- प्राथमिक कुंजी के आधार पर, उन्हें ओवरराइड करें
hashCode()
/equals()
टूट गए हैं- सही पहचान (सभी प्रबंधित संस्थाओं के लिए)
- अलग संस्थाओं के साथ समस्याएं
- उन्हें ओवरराइड करें, बिज़नेस-ईद (गैर-प्राथमिक कुंजी फ़ील्ड के आधार पर ; विदेशी कुंजियों के बारे में क्या?)
hashCode()
/equals()
टूट गए हैं- सही पहचान (सभी प्रबंधित संस्थाओं के लिए)
- अलग संस्थाओं के साथ कोई समस्या नहीं है
मेरे प्रश्न हैं:
- क्या मुझे एक विकल्प और / या समर्थक / कांग्रेस बिंदु याद आया?
- आपने क्या विकल्प चुना और क्यों?
अद्यतन 1:
द्वारा " hashCode()
/ equals()
टूट रहे हैं", मुझे लगता है कि लगातार मतलब hashCode()
आमंत्रण भिन्न मूल्यों वापस आ सकते हैं, जो है (जब सही ढंग से लागू) के अर्थ में टूट नहीं Object
API दस्तावेज़ है, लेकिन जब एक से एक बदली हुई इकाई प्राप्त करने का प्रयास है जो समस्याओं का कारण बनता Map
, Set
या अन्य हैश-आधारित Collection
। नतीजतन, जेपीए कार्यान्वयन (कम से कम एक्लिप्सलिंक) कुछ मामलों में सही ढंग से काम नहीं करेगा।
अद्यतन 2:
आपके उत्तर के लिए धन्यवाद - उनमें से अधिकांश में उल्लेखनीय गुणवत्ता है।
दुर्भाग्य से, मैं अभी भी अनिश्चित हूं कि वास्तविक जीवन के आवेदन के लिए कौन सा दृष्टिकोण सबसे अच्छा होगा, या मेरे आवेदन के लिए सबसे अच्छा तरीका कैसे निर्धारित किया जाएगा। इसलिए, मैं प्रश्न को खुला रखूंगा और कुछ और चर्चाओं और / या राय की उम्मीद करूंगा।
hashcode()
एक ही वस्तु उदाहरण पर कॉल करना, उसी मूल्य को वापस करना चाहिए, जब तक कि equals()
कार्यान्वयन में उपयोग किए गए किसी भी फ़ील्ड का उपयोग नहीं किया जाता है । दूसरे शब्दों में, यदि आपके पास अपनी कक्षा में तीन फ़ील्ड हैं और आपकी equals()
विधि उदाहरणों की समानता का निर्धारण करने के लिए उनमें से केवल दो का उपयोग करती है, तो आप hashcode()
उन फ़ील्ड के मूल्यों में से एक को बदलने के लिए वापसी मूल्य की उम्मीद कर सकते हैं - जो आपके विचार करने पर समझ में आता है यह ऑब्जेक्ट इंस्टेंस अब उस मूल्य के लिए "बराबर" नहीं है जो पुराने इंस्टेंस का प्रतिनिधित्व करता है।