2012-04-09 19 views
6

मेरे पास कोड से नीचे है जो बराबर() और हैशकोड() विधियों को ओवरराइड करता है।गेटर्स बराबर और हैशकोड में उपयोग किया जा सकता है?

public boolean equals(Object obj) 
{ 
    if (obj == null) 
    return false; 
    if (!(obj instanceof Name)) 
    return false; 
    Name name = (Name) obj; 
    return this.name.equals(name.name); 
} 

public int hashCode() 
{ 
    return name.hashCode(); 
} 
यहाँ

मैं 2 लाइनों के नीचे की जगह ले सकता:

return this.name.equals(name.name); 
return name.hashCode(); 

साथ

return this.getName().equals(name.getName()); 
return getName().hashCode(); 

मैं बजाय गुणों का उपयोग करके मैं सीधे ही टिककर खेल के अंदर के बराबर होती है और hashCode तरीकों का उपयोग कर सकते हैं की क्या मतलब है?

धन्यवाद!

+0

और क्यों नहीं?:) –

+0

हाँ, कोई समस्या नहीं है। – MJM

+0

हां। आप बस सेटर्स या फ़ील्ड्स का उपयोग नहीं कर सकते हैं, जब ऑब्जेक्ट संग्रह में होता है तो संशोधित किया जा सकता है। –

उत्तर

1

आप कर सकते हैं, लेकिन आप क्यों? विकल्प ए: संकलक उस रूप में रेखांकित करता है, ताकि आप किसी भी क्षेत्र के संदर्भ के साथ समाप्त हो जाएं। विकल्प बी: कंपाइलर कॉल को रेखांकित नहीं करता है, यानी आपने एक अतिरिक्त विधि कॉल पेश की है।

सुगमता के लिए भी प्रभाव हैं- यदि name फ़ील्ड कक्षा के भीतर सीधे पहुंच योग्य है, तो इसका संदर्भ क्यों न दें? मुझे यह पढ़ने में आसान लगता है, लेकिन कुछ लोगों को यह असंगत लगता है।

+0

एक छोटे से नोट के रूप में। यदि आप मोकिटो का उपयोग करते हैं, और गेटर्स में से एक को नकल करते हैं जो बराबर में उपयोग किया जाता है और आपकी बराबर विधि अंतिम होती है तो आप अनंत लूप नरक पर जायेंगे। मोकिटो आपके खेतों को नकल करने के लिए आंतरिक रूप से बराबर उपयोग करता है। आम तौर पर यह आपको बराबर लिखता है, लेकिन यदि इसे अंतिम के रूप में चिह्नित किया गया है तो आपको स्टैकओवरफ्लोएरर – Lori

3

हाँ यकीन है कि आप इस इस्तेमाल कर सकते हैं,

hashcode() और equals() क्षेत्र तरीके हैं, वे निजी सदस्यों को सीधे उपयोग कर सकते हैं, लेकिन क्या हुआ अगर कुछ तर्क एक्सेसर विधि में लिपटे नहीं है, तो वह हमेशा पहुँच के लिए सुरक्षित है एक्सेसर विधियों का उपयोग कर फ़ील्ड

0

हां, आप क्यों नहीं कर पाएंगे?

भविष्य में, इस तरह की चीजों के साथ, मैं आपको सलाह देता हूं कि आप इसे आज़माएं और देखें।

0

हाँ आप कर सकते हैं। क्यों नहीं? आपके संदेह क्या हैं?

1

हां, मैं equals() & hashCode() कार्यान्वयन में गेटर्स का उपयोग करने की दृढ़ता से अनुशंसा करता हूं। और मेरे सबसे अच्छे ज्ञान के लिए, यह आपको किसी भी तरह से नुकसान नहीं पहुंचाएगा।

गेटर्स के बिना equals() का कार्यान्वयन आपको दो प्रॉक्सी ऑब्जेक्ट की तुलना करते समय सही परिणाम देने में विफल रहेगा।

उदाहरण के लिए: आप दो प्रॉक्सी आपके मौलिक हाइबरनेट दाव द्वारा दिया वस्तुओं की तुलना की कोशिश, तो आप अपने equals() विधि से सच प्राप्त नहीं करेंगे, भले ही वे एक ही वस्तुओं रहे हैं।

अद्यतन

उपयोग गेटर सीधी पहुँच के बजाय तरीकों। ऐसा इसलिए है क्योंकि ऑब्जेक्ट उदाहरण अन्य के रूप में पारित हो सकता है, जो प्रॉक्सी ऑब्जेक्ट हो सकता है, वास्तविक उदाहरण नहीं। इस प्रॉक्सी को आरंभ करने के लिए, आपको इसे गेटर विधि से एक्सेस करना होगा।

यह प्रभावी जावा से एक अंश है। अधिक जानकारी के लिए this देखें।

+0

मिलता है, मुझे पता है कि यह उत्तर देने के लिए पुराना क्वेशियन है, लेकिन मुझे यकीन है कि इससे प्रॉक्सी के साथ काम करने में मदद मिलेगी। – Diablo

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