दिलचस्प पोस्ट
जेवीएम विकल्प -XSS – यह बिल्कुल क्या करता है? जावास्क्रिप्ट / jQuery में पिक्सेल स्ट्रिंग की लंबाई निर्धारित करें? SQL विभाजन अल्पविराम से अलग पंक्ति .crt को .pem कन्वर्ट कैसे करें जावा में दी गई कक्षा के लिए अर्रे कक्षा कैसे प्राप्त करें? मैं autoload के साथ PHP नामस्थान का उपयोग कैसे करूं? Ccipy.stats आयात करने के बाद ctrl-c क्रैश करता है आरएसए सार्वजनिक / निजी कुंजी कैसे स्टोर / पुनर्प्राप्त करें PHP का उपयोग करते हुए मिनटों और मिनटों में मिनटों की संख्या में बदलाव करें उपखंड एसवीएन: अनदेखा करें सी # या .NET में सबसे खराब वाला क्या है? यह तय करने के लिए कि क्या वे समान हैं, दो समान-आकार के बिटमैप्स की तुलना सबसे तेज़ तरीका क्या है? आईओएस 5: एक इमोजी को एक यूनिकोड वर्ण में कनवर्ट कैसे करें? कस्टम संग्रह Initializers छवि क्लिपबोर्ड पर कॉपी करें

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

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

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

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

Solutions Collecting From Web of "बराबर अनुबंध को लागू करने का सही तरीका"

यह "तकनीकी समानता" के लिए (लगभग) सही है, लेकिन "प्राकृतिक समानता" के लिए नहीं है शीर्ष तकनीकी समानता को प्राप्त करने के लिए, आपको सकारात्मक को भी जांचना चाहिए 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