वहाँ इतने पर दो समान प्रश्न हैं वस्तुओं:दीप पुनरावर्ती तुलना (एक बार फिर)
Is there a Java reflection utility to do a deep comparison of two objects?
Deep reflective compare equals
लेकिन, यह हास्यास्पद है, उनमें से कोई भी सवाल का पूरी तरह से सही जवाब देता है।
boolean deepEquals(Object obj1, Object obj2)
अर्थात किसी भी अपवाद फेंकने और इतने पर बिना:
मुझे और अन्य प्रश्न के लेखक क्या वास्तव में चाहते हैं, कुछ पुस्तकालय जो सिर्फ बता देंगे दो वस्तुओं के बराबर या नहीं दिया जाता है में कुछ विधि है।
apache
का EqualsBuilder
रास्ता नहीं है, क्योंकि इसकी तुलना गहरी तुलना नहीं करती है।
Unitils
भी बुरा निर्णय लगता है, क्योंकि इसकी विधि true
या false
वापस नहीं आती है; यदि तुलना विफल हुई तो यह सिर्फ अपवाद फेंकता है। बेशक, यह इस तरह से इस्तेमाल किया जा सकता है:
Difference difference = ReflectionComparatorFactory.createRefectionComparator(new ReflectionComparatorMode[]{ReflectionComparatorMode.LENIENT_ORDER, ReflectionComparatorMode.IGNORE_DEFAULTS}).getDifference(oldObject, newObject);
लेकिन यह बहुत बदसूरत लगता है, और unitils
पुस्तकालय पूरी तरह से बहुत कठिन के लिए आवश्यक उद्देश्यों की तुलना हो रहा है।
इसके अलावा, यह स्पष्ट है कि इस तरह के deepEquals
स्वयं को कैसे बनाया जाए, लेकिन यह संभावना नहीं है कि सामान्य रूप से उपयोग की जाने वाली लाइब्रेरी नहीं हैं जिनमें पहले से ही लागू विधि शामिल है। कोई विचार?
रिकर्सिव तुलना तुच्छ नहीं है। 'EqualsBuilder.reflectionEquals' विधि को देखें - यह आपको निर्दिष्ट करता है कि कौन से फ़ील्ड तुलना नहीं करते हैं और विरासत का उपयोग होने पर कक्षा पदानुक्रम के पेड़ में कितनी दूर तक पहुंचने के लिए। अब यदि आपके पास घोंसला वाली वस्तु है जिसे आप प्रतिबिंब का उपयोग करके तुलना करना चाहते हैं, तो आप कैसे बता सकते हैं कि किन क्षेत्रों को अनदेखा करना है? यदि आपको परवाह नहीं है, तो आपको जो चाहिए उसे प्राप्त करने के लिए 'बराबर बिल्डर' कार्यान्वयन को लपेटना आसान है। अन्यथा आपको यह जानने के लिए एनोटेशन या रजिस्ट्री का उपयोग करने की आवश्यकता हो सकती है कि किन वर्गों की तुलना नहीं की जा सकती है। – krzychu