दिलचस्प पोस्ट
JQuery.Ajax द्वारा एक फ़ाइल डाउनलोड करें एसक्यूएल: केवल शून्य मानों के साथ कॉलम का चयन करें अधिसूचना न दिखाए जाने के पहले कैसे? एक HTML पृष्ठ से पुनर्निर्देशित करें जावास्क्रिप्ट कस्टम इवेंट श्रोता JQuery में नियमित अभिव्यक्ति फ़ील्ड सत्यापन जावा: पार्स ईआर वैल्यू से एक चार क्या सी ++ स्ट्रैट के सदस्य डिफ़ॉल्ट रूप से 0 पर आरंभ किए जाते हैं? लंबे समय से चलने वाली PHP स्क्रिप्ट को प्रबंधित करने का सर्वोत्तम तरीका है? जावास्क्रिप्ट में "फंक्शन *" क्या है? कश्मीर बीट सेट के साथ लम्बाई के सभी द्विआधारी स्ट्रिंग उत्पन्न करें JavaScript स्क्रिप्ट को निष्पादित करने के लिए मना कर दिया। अनुरोध के भीतर स्रोत कोड प्राप्त किया गया समायोजित करेंटेकबंदी को संपादित करने से कीबोर्ड को रोकने में नहीं में अंतर्निहित एनिमेशन को अक्षम करना – गैर-अंग्रेजी अक्षरों से मिलान करने के लिए नियमित अभिव्यक्ति?

बराबर अनुबंध को लागू करने का सही तरीका

मेरे पास उपयोगकर्ता नाम वाला डोमेन ऑब्जेक्ट है उपयोगकर्ता के गुणों में ssoId, नाम, ईमेल, बनाया गया, बनाया दिनांक और userRole शामिल हैं इनमें से, एसओओआईडी को इस अर्थ में अनूठा होना चाहिए कि कोई भी दो उपयोगकर्ता एक ही एसएसओ आईडी नहीं हो सकता है इसलिए मेरे एसएसयू आईडी के लिए विधि की जांच के बराबर होती है और ये सही या गलत है।

@Override public boolean equals(Object o) { if (!(o instanceof User)) return false; return user.getSsoId().equals((User)o.getSsoId()); } 

मुझे क्या लगता है कि यह एक गलत कार्यान्वयन है, यद्यपि व्यवसाय नियमों के संबंध में यह सही है। उपरोक्त क्रियान्वयन एक ही एसएसओ आईडी के साथ दो वस्तुओं के लिए सही होगा लेकिन नाम या ईमेल या दोनों के लिए अलग-अलग मूल्यों के साथ। क्या मुझे सभी क्षेत्रों की समानता की जांच करने के लिए अनुबंध बराबर बदलना चाहिए? आपका क्या सुझाव है?

वेब के समाधान से एकत्रित समाधान "बराबर अनुबंध को लागू करने का सही तरीका"

यह "तकनीकी समानता" के लिए (लगभग) सही है, लेकिन "प्राकृतिक समानता" के लिए नहीं है शीर्ष तकनीकी समानता को प्राप्त करने के लिए, आपको सकारात्मक को भी जांचना चाहिए o == this ऐसा हो सकता है कि वस्तु अभी तक डीबी में कायम नहीं है और इस प्रकार अभी तक एक तकनीकी आईडी नहीं है। उदाहरण के लिए

 public class User { private Long id; @Override public boolean equals(Object object) { return (object instanceof User) && (id != null) ? id.equals(((User) object).id) : (object == this); } @Override public int hashCode() { return (id != null) ? (User.class.hashCode() + id.hashCode()) : super.hashCode(); } } 

"प्राकृतिक समानता" के लिए आपको सभी गैर तकनीकी गुणों की तुलना करना चाहिए। "वास्तविक दुनिया संस्थाओं" के लिए यह तकनीकी समानता की तुलना में अधिक मजबूत (लेकिन इससे भी ज्यादा महंगा) होने के बाद है।

 public class User { private String name; private Date birth; private int housenumber; private long phonenumber; @Override public boolean equals(Object object) { // Basic checks. if (object == this) return true; if (!(object instanceof User)) return false; // Property checks. User other = (User) object; return Objects.equals(name, other.name) && Objects.equals(birth, other.birth) && (housenumber == other.housenumber) && (phonenumber == other.phonenumber); } @Override public int hashCode() { return Objects.hash(name, birth, housenumber, phonenumber); } } 

सच है, यह बहुत सारे कोड है जब बहुत सारे गुण हैं थोड़ा सा सभ्य आईडीई (ग्रहण, नेटबीन आदि) बस आप के लिए equals() , hashCode() (और भी toString() , गेटर्स और सेटर्स) को स्वत: उत्पन्न कर सकते हैं इसका लाभ उठाएं एक्लिप्स में, राइटक्लिक कोड और स्रोत (Alt + Shift + S) मेन्यू विकल्प देखें।

यह भी देखें:

  • जेबॉस: इक्लल्स एंड हैशकोड ( दृढ़ता के मद्देनजर)
  • सीतनिद्रा में होना: निरंतर क्लासेस – कार्यान्वयन बराबर () और हैशोड ()
  • संबंधित SO प्रश्न: जावा में अतिव्यापी बराबर और हैशोड

यदि आपके मॉडल में ssoid अद्वितीय होना चाहिए, तो इसका मतलब है कि अन्य फ़ील्ड के मान उपयोगकर्ता के दो उदाहरणों के लिए अलग नहीं होने चाहिए। यदि आप उस धारणा को मान्य करना चाहते हैं, तो आप इसे बराबर विधि के भीतर दावा कर सकते हैं यदि ओवरहेड कोई समस्या नहीं है।

आप क्या कर रहे हैं ठीक लग रहा है, और आप किसी भी नियम का उल्लंघन नहीं कर रहे हैं जो equals पालन ​​करना चाहिए।

आप अभी भी अन्य फ़ील्ड की जांच करना चाहते हैं, equals के शब्दों को बदलने के लिए नहीं, बल्कि अपने व्यापारिक तर्क में असंगतता का पता लगा सकते हैं और संभावित रूप से एक तर्क / अपवाद ट्रिगर कर सकते हैं।

यह बनाने का एक मुश्किल निर्णय है

यह एक मौके है जब मैंने कुछ महीनों पहले हिसिंग पर विचार किया था। मैं सुझाव देता हूं कि आपने एक हैश पर क्या पढ़ा है, क्योंकि यह आपके उत्तर के लिए बेहद प्रासंगिक है … मेरा सुझाव है कि आप किसी भी प्रकार के हैश को लागू करने और इसकी समानता का परीक्षण करने के लिए देख रहे हैं।

विभिन्न प्रकार की समानताएं हैं … वस्तु की पहचान की समानता है, वस्तु के आंकड़ों की समानता, संपूर्ण वस्तु की समानता … आप वहां भी लेखा परीक्षा की जानकारी भी शामिल कर सकते हैं।

तथ्य यह है कि 'बराबर' के कई संभव अर्थ हैं

मैंने सभी क्षेत्रों में सख्त समानता के रूप में समान रूप से कार्यान्वयन करके इसका समाधान किया क्योंकि बस पूछने के बाद यह बराबर का सहज अर्थ है। तब मैंने अन्य प्रकार की समानता के लिए मैथोस का निर्माण किया था और इन्हें लपेट करने के लिए एक अंतरफलक की आवश्यकता थी और परिभाषित किया था।

मैं ऑब्जेक्ट == पर परीक्षण समानता नहीं चाहता क्योंकि अक्सर आप उसी डेटा के साथ दो अलग-अलग ऑब्जेक्ट्स का परीक्षण कर रहे हैं जो मेरी पुस्तक में अलग-अलग मेमोरी पतों का जिक्र करने के बावजूद समान हैं I