जब आप अपनी खुद की कुंजी जोड़ी बनाते हैं, तो आपको कुछ चीजों का सामना करना चाहिए।
सबसे पहले, आपको लागू करने के बारे में पता होना चाहिए hashCode()
और equals()
। आपको ऐसा करने की आवश्यकता होगी।
दूसरा, लागू करते समय hashCode()
, सुनिश्चित करें कि आप समझते हैं कि यह कैसे काम करता है। दिए गए उपयोगकर्ता उदाहरण
public int hashCode() {
return this.x ^ this.y;
}
वास्तव में सबसे खराब कार्यान्वयन में से एक है जो आप कर सकते हैं। कारण सरल है: आपके पास बहुत अधिक हैश है! और ऐसे hashCode()
इंट्रा वैल्यूज लौटाने चाहिए जो सबसे अच्छे, अनूठे हों, यह सबसे अच्छा है। कुछ इस तरह का उपयोग करें:
public int hashCode() {
return (X << 16) + Y;
}
यह तेज है और -2 ^ 16 और 2 ^ 16-1 (-65536 से 65535) के बीच कुंजियों के लिए अद्वितीय हैश देता है। यह लगभग किसी भी मामले में फिट बैठता है। बहुत कम ही आप इस सीमा से बाहर हैं।
तीसरा, जब लागू हो equals()
यह भी जानता है कि इसका उपयोग किस लिए किया जाता है और इस बात से अवगत रहें कि आप अपनी चाबी कैसे बनाते हैं, क्योंकि वे वस्तुएं हैं। अक्सर आप अनावश्यक करते हैं यदि बयानों का कारण बनता है तो आपके पास हमेशा एक ही परिणाम होगा।
यदि आप इस तरह से चाबियाँ बनाते हैं: map.put(new Key(x,y),V);
तो आप कभी भी अपनी कुंजी के संदर्भों की तुलना नहीं करेंगे। हर बार जब आप नक्शे को आरोपित करना चाहते हैं, तो आप कुछ ऐसा करेंगे map.get(new Key(x,y));
। इसलिए आपके equals()
कथन की आवश्यकता नहीं है if (this == obj)
। यह कभी नहीं होगा ।
इसके बजाय if (getClass() != obj.getClass())
अपने equals()
बेहतर उपयोग में if (!(obj instanceof this))
। यह उपवर्गों के लिए भी मान्य होगा।
तो केवल एक चीज जिसकी आपको तुलना करने की आवश्यकता है वह वास्तव में एक्स और वाई है। इसलिए equals()
इस मामले में सबसे अच्छा कार्यान्वयन होगा:
public boolean equals (final Object O) {
if (!(O instanceof Key)) return false;
if (((Key) O).X != X) return false;
if (((Key) O).Y != Y) return false;
return true;
}
तो अंत में आपका प्रमुख वर्ग इस प्रकार है:
public class Key {
public final int X;
public final int Y;
public Key(final int X, final int Y) {
this.X = X;
this.Y = Y;
}
public boolean equals (final Object O) {
if (!(O instanceof Key)) return false;
if (((Key) O).X != X) return false;
if (((Key) O).Y != Y) return false;
return true;
}
public int hashCode() {
return (X << 16) + Y;
}
}
आप अपने आयाम सूचकांकों X
और Y
एक सार्वजनिक पहुंच स्तर दे सकते हैं , इस तथ्य के कारण कि वे अंतिम हैं और संवेदनशील जानकारी शामिल नहीं है। मुझे कोई 100% यकीन नहीं है कि क्या किसी भी मामले private
में एक्सेस स्तर सही ढंग से काम करता है जब कोई कास्टिंग करता Object
हैKey
।
यदि आप फाइनल के बारे में आश्चर्य करते हैं, तो मैं किसी भी चीज को अंतिम घोषित करता हूं कि कौन सा मूल्य अस्थिरता पर सेट है और कभी नहीं बदलता है - और इसलिए एक वस्तु स्थिर है।