समान रूप से लागू करने के लिए सर्वोत्तम प्रथाएं क्या हैं, अर्थात् तकनीकी रूप से नहीं।
जावा में equals
विधि वास्तव में, क्योंकि यह कैसे Collection
और Map
कार्यान्वयन के साथ एकीकृत के "identity equals" होने के लिए विचार किया जाना चाहिए। निम्नलिखित पर विचार करें:
public class Foo() {
int id;
String stuff;
}
Foo foo1 = new Foo(10, "stuff");
fooSet.add(foo1);
...
Foo foo2 = new Foo(10, "other stuff");
fooSet.add(foo2);
तो Foo
पहचान id
क्षेत्र तो 2 fooSet.add
नहींSet
के लिए एक और तत्व जोड़ना चाहिए है लेकिन जब से वे एक ही id
है पहले एक प्रतिस्थापित करना चाहिए। यदि आप (और हैशकोड) विधि को दोनोंid
और stuff
फ़ील्ड्स को शामिल करने के लिए परिभाषित करते हैं तो यह टूटा जाएगा और Set
में उसी आईडी फ़ील्ड वाले ऑब्जेक्ट में 2 संदर्भ हो सकते हैं।
आप एक Collection
(या Map
) में वस्तुओं के भंडारण नहीं कर रहे हैं, तो आप equals
विधि इस तरह से परिभाषित करने के लिए की जरूरत नहीं है, लेकिन यह कई द्वारा माना जाता है बुरा रूप माना जाता है। यदि भविष्य में आप इसे Collection
पर संग्रहीत करें तो चीजें तोड़ दी जाएंगी।
यदि सभी क्षेत्रों की समानता के परीक्षण के लिए की आवश्यकता है, तो मैं एक और तरीका लिखता हूं। कुछ equalsAllFields(Object obj)
या कुछ ऐसे जैसे।
तो फिर तुम जैसे कुछ करना होगा:
assertTrue(obj1.equalsAllFields(obj2));
इसके अलावा, एक उचित व्यवहार equals
तरीकों जिसके खाते परिवर्तनशील क्षेत्रों में रखना परिभाषित नहींहै। जब हम कक्षा पदानुक्रमों के बारे में बात करना शुरू करते हैं तो समस्या भी मुश्किल हो जाती है।परिभाषित बराबर:
Point p = new Point(1, 2);
// ColoredPoint extends Point
ColoredPoint c = new ColoredPoint(1, 2, Color.RED);
// this is true because both points are at the location 1, 2
assertTrue(p.equals(c));
// however, this would return false because the Point p does not have a color
assertFalse(c.equals(p));
कुछ और पढ़ने मैं अत्यधिक की सिफारिश करेंगे "ख़तरा # 3 है: एक बच्चे वस्तु अपने स्थानीय क्षेत्रों और आधार वर्ग equals
तो इसकी समरूपता का उल्लंघन किया गया का एक संयोजन के रूप में परिभाषित करता है, तो equals
How to Write an Equality Method in Java
कुछ additio: इस महान पेज में परिवर्तनशील क्षेत्रों में "खंड संदर्भ में एनएएल लिंक:
ओह, और सिर्फ भावी पीढ़ी के लिए, आप क्या समानता निर्धारित करने के लिए की तुलना करने के लिए चुन-प्रांगण की परवाह किए बिना, आप hashCode
गणना में एक ही क्षेत्रों का उपयोग करने की आवश्यकता है । equals
और hashCode
सममित होना चाहिए। यदि दो ऑब्जेक्ट बराबर हैं, तो में एक ही हैश-कोड होना चाहिए। विपरीत जरूरी नहीं है।
'यूनिट-टेस्ट लिखते समय, मुझे अक्सर स्थिति का सामना करना पड़ता है जब परीक्षण में कुछ ऑब्जेक्ट के बराबर() - निष्कर्षों में - वास्तविक वातावरण में यह कैसे काम करता है उससे अलग काम करना चाहिए।' आप इसे कभी क्यों चाहेंगे? – helpermethod
क्योंकि पहचान, और समानता है। कई स्थितियों के लिए, पहचान काफी अच्छी है, खासकर डीबी ऐप्स में। परीक्षण में, हालांकि, आसानी से स्थितियां हो सकती हैं जहां आप हैं, शायद "प्रतिलिपि" प्रतिलिपि की तुलना में "पहले" प्रतिलिपि बनाने के लिए, और इन मामलों में पहचान पर्याप्त नहीं है, आप गहराई से जाना चाहते हैं वस्तु के वास्तविक क्षेत्रों। –