2011-10-18 8 views
6

अगर केवल एक वस्तु के क्षेत्र के कुछ वास्तविक राज्य का प्रतिनिधित्व करता है, मैं जब equals और hashCode अधिभावी इन पर ध्यान नहीं दिया जा सकता है लगता है ...बराबर/हैशकोड में कुछ फ़ील्ड को अनदेखा करते समय संभावित नुकसान?

मैं इस बारे में एक असहज महसूस पाने हालांकि, और पूछने के लिए,

चाहता था
  1. क्या यह सामान्य प्रथा है?
  2. क्या इस दृष्टिकोण के साथ कोई संभावित नुकसान है?
  3. equals/hashCode में कुछ फ़ील्ड को अनदेखा करने के लिए कोई दस्तावेज या दिशानिर्देश हैं?

मेरी विशेष स्थिति में, मैं एक समस्या के लिए एक राज्य अंतरिक्ष की खोज कर रहा हूँ। मैं देखे गए राज्यों का हैश सेट रखना चाहता हूं, लेकिन मैं पथ सहित राज्य पर भी विचार कर रहा हूं। जाहिर है, दो राज्य बराबर हैं, भले ही वे विभिन्न पथों के माध्यम से पाए जाते हैं।

उत्तर

3

यह इस बात पर आधारित है कि आप किसी दिए गए ऑब्जेक्ट की विशिष्टता पर विचार कैसे करेंगे। यदि इसकी प्राथमिक कुंजी (अद्वितीय कुंजी) है, तो अकेले उस विशेषता का उपयोग करना पर्याप्त है।

यदि आपको लगता है कि विशिष्टता 10 अलग-अलग विशेषताओं का संयोजन है, तो बराबर में सभी 10 विशेषताओं का उपयोग करें।

फिर केवल उन गुणों का उपयोग करें जिन्हें आपने हैशकोड उत्पन्न करने के बराबर बराबर उपयोग किया है क्योंकि उसी ऑब्जेक्ट्स को एक ही हैशकोड उत्पन्न करना चाहिए।

बराबर और हैशकोड के लिए विशेषता (ओं) का चयन करना यह है कि आप किसी दिए गए ऑब्जेक्ट की विशिष्टता को कैसे परिभाषित करते हैं।

  • क्या यह सामान्य प्रथा है? हां

  • क्या इस दृष्टिकोण के साथ कोई संभावित नुकसान है? नहीं

  • क्या कुछ फ़ील्ड या दिशानिर्देश हैं जब बराबर/हैशकोड में कुछ फ़ील्ड को अनदेखा करने की बात आती है?

    "द वर्ग वस्तु के लिए विधि वस्तुओं पर सबसे भेदभाव संभव तुल्यता संबंध लागू करता है के बराबर होती है,"

इस वस्तु वर्ग जावाडोक से है। लेकिन कक्षा के लेखक के रूप में, आप जानते हैं कि विशिष्टता को कैसे परिभाषित किया जाता है।

+0

आपने उल्लेख किया है के रूप में, आप "पथ" अपने बराबर या hashCode() –

+0

मैं इस सवाल का जवाब चाहते में शामिल नहीं हैं, लेकिन आप कुछ हद तक मेरी तीन सवालों से बचने :-) – aioobe

+0

अपने प्रश्नों का उत्तर। –

2

आखिरकार, "बराबर" का अर्थ है कि आप इसका क्या मतलब चाहते हैं। प्रतिबंध है कि "बराबर" मानों को एक ही हैशकोड वापस करना होगा, और, ज़ाहिर है, यदि दो समान पते "बराबर" के साथ प्रस्तुत किया जाना चाहिए तो सत्य वापस आना चाहिए। लेकिन, उदाहरण के लिए, एक "बराबर" हो सकता है जो दो वेब पृष्ठों की सामग्री की तुलना करता है (नॉन के लिए दोहराने की समस्या को अनदेखा कर रहा है), और भले ही यूआरएल अलग थे, फिर भी "बराबर" कहा गया है यदि पृष्ठ सामग्री कुछ में मेल खाती है मार्ग।

0

Object पर विधियों को ओवरराइड करने के लिए मैंने देखा सर्वोत्तम दस्तावेज/दिशानिर्देश जोश ब्लोच के Effective Java में थे। इसका "संपूर्ण ऑब्जेक्ट्स के लिए सामान्य तरीके" पर एक संपूर्ण अध्याय है जिसमें "बराबर ओवरराइड करते समय सामान्य अनुबंध का पालन करें" और "बराबर ओवरराइड करते समय हमेशा हैशकोड ओवरराइड करें" के बारे में अनुभाग शामिल हैं। यह विस्तार से वर्णन करता है कि इन दो तरीकों को ओवरराइड करते समय आपको उन चीजों पर विचार करना चाहिए। मैं सीधे जवाब नहीं दूंगा; किताब निश्चित रूप से प्रत्येक जावा डेवलपर के लिए लागत के लायक है।

संबंधित मुद्दे