जब जावा में एक UDT के लिए #equals
कार्यान्वयन उपलब्ध कराने के शर्तों में से एक है कि पारित कर दिया तर्क वस्तु वर्तमान वर्ग का एक उदाहरण अन्यथा हम असफल फास्ट return false
Effective Java देख होना चाहिए है (EJ2) । हालांकि, हाइबरनेट 4 का उपयोग करते समय हम आलसी लोडिंग के कारण जावासिस्ट प्रॉक्सी उदाहरणों के साथ समाप्त हो सकते हैं जहां यह #equals
स्थिति विफल हो जाएगी। इस पर काबू पाने के लिए सबसे अच्छा विकल्प क्या होगा? कुछ विकल्प मैं के बारे में सोच सकते हैं:हाइबरनेट javassist प्रॉक्सी और `वस्तु # equals`
- खाते में प्रॉक्सी मामले को लेने के
equals
कार्यान्वयन का विस्तार। विपक्ष: रखरखाव टोल, हाइबरनेट प्रॉक्सी इंफ्रास्ट्रक्चर, हैकी, इकाई या डोमेन मॉडल को हार्डवायर निर्भरता ओआरएम का उपयोग करने के लिए अज्ञेयवादी होना चाहिए, क्योंकि उन्हें विभिन्न संदर्भों में पुन: उपयोग किया जा सकता है जहां ORM की आवश्यकता नहीं है। स्विंग यूआई। - जांचें कि यह
equals
पर आक्रमण करने से पहले प्रॉक्सी है या नहीं। विपक्ष: हमेशा संभव नहीं है, यानी, संग्रह से निपटने औरequals
के निहित आमंत्रण, उदाहरण के लिए, मानचित्र। - आलसी लोडिंग का उपयोग करने से बचें। विपक्ष: सभी उपयोग-मामलों में उचित और न ही कुशल।
अद्यतन
EJ2 की समीक्षा फिर से मुझे विश्वास है कि निम्नलिखित सभी स्थितियों (टाइप-प्रकार, टाइप-प्रॉक्सी, प्रॉक्सी-प्रकार और प्रॉक्सी-प्रॉक्सी) के लिए काम करेंगे, लेकिन जैसा कि टिप्पणियों में से एक में बताया यदि टाइप की तुलना पूरी तरह से अलग प्रकार से की जाती है, तो इसके नीचे लूप हमेशा के लिए हो सकता है Person.equals(Employee)
और दोनों समान ईजे 2 मानदंडों का उपयोग करते हैं। वर्ग समानता 1. बदलें instanceof के बजाय बराबरी का उपयोग करें:
if (this.getClass() != anObject.getClass())
{
return anObject.equals(this);
}
बस यह सुनिश्चित कर लें कि प्रॉक्सी आपकी इकाई की कक्षा का विस्तार करेगी? –
प्रॉक्सी उदाहरणों का विस्तार नहीं होता है, 'InvocationHandler' और स्थिति' (this.getClass() == anObject.getClass()) देखें, निश्चित रूप से, झूठी का मूल्यांकन करेगा। –
आपने एक विकल्प छोड़ा: प्रभावी जावा सलाह को अनदेखा करें और subclasses को .equals() में अनुमति दें। –