मुझे यह सवाल पसंद है! मुख्य रूप से क्योंकि यह शायद ही कभी जवाब दिया या बुरी तरह से जवाब दिया है। यह ऐसा है जैसे किसी ने अभी तक इसका पता नहीं लगाया है। वर्जिन क्षेत्र :)
सबसे पहले, का उपयोग करने के बारे में भी मत सोचोequals
। के अनुबंध equals
, के रूप में जावाडोक में परिभाषित किया गया है, एक तुल्यता संबंध (कर्मकर्त्ता, सममित, और सकर्मक), है न एक समानता संबंध। उसके लिए, यह एंटीसिममेट्रिक भी होना चाहिए। इसका एकमात्र कार्यान्वयन equals
(या कभी भी हो सकता है) एक सच्चे समानता का संबंध है java.lang.Object
। भले ही आपने equals
ग्राफ़ की हर चीज़ की तुलना करने के लिए उपयोग किया हो , लेकिन अनुबंध तोड़ने का जोखिम काफी अधिक है। जैसा कि जोश बलोच ने प्रभावी जावा में बताया , बराबरी का अनुबंध तोड़ना बहुत आसान है:
"बराबरी के अनुबंध को संरक्षित करते हुए एक तात्कालिक वर्ग का विस्तार करने और एक पहलू को जोड़ने का कोई तरीका नहीं है"
इसके अलावा क्या एक बूलियन विधि वास्तव में आप वैसे भी है? यह वास्तव में मूल और क्लोन के बीच के सभी अंतरों को अलग करना अच्छा होगा, क्या आपको नहीं लगता है? इसके अलावा, मैं यहाँ यह मानूंगा कि आप ग्राफ़ में प्रत्येक ऑब्जेक्ट के लिए तुलना कोड लिखने / बनाए रखने से परेशान नहीं होना चाहते हैं, बल्कि आप कुछ ऐसी चीज़ की तलाश कर रहे हैं जो स्रोत के साथ स्केल हो जाए क्योंकि यह समय के साथ बदलता रहता है।
Soooo, जो आप वास्तव में चाहते हैं वह किसी प्रकार का राज्य तुलना उपकरण है। वह उपकरण कैसे कार्यान्वित किया जाता है यह वास्तव में आपके डोमेन मॉडल की प्रकृति और आपके प्रदर्शन प्रतिबंधों पर निर्भर करता है। मेरे अनुभव में, कोई सामान्य जादू की गोली नहीं है। और बड़ी संख्या में पुनरावृत्तियों पर यह धीमा हो जाएगा। लेकिन एक क्लोन ऑपरेशन की पूर्णता का परीक्षण करने के लिए, यह बहुत अच्छा काम करेगा। आपके दो सर्वश्रेष्ठ विकल्प क्रमबद्धता और प्रतिबिंब हैं।
कुछ मुद्दों पर आप का सामना करेंगे:
- संग्रह क्रम: क्या दो संग्रह समान माने जाने चाहिए यदि वे एक ही वस्तु को धारण करते हैं, लेकिन एक अलग क्रम में?
- किन क्षेत्रों की अनदेखी: क्षणिक? स्टेटिक?
- प्रकार तुल्यता: क्या फील्ड मान बिल्कुल एक ही प्रकार के होने चाहिए? या एक का विस्तार दूसरे के लिए करना ठीक है?
- वहाँ अधिक है, लेकिन मैं भूल गया ...
XStream बहुत तेज़ है और XMLUnit के साथ मिलकर कोड की कुछ लाइनों में काम करेगा। XMLUnit अच्छा है क्योंकि यह सभी मतभेदों की रिपोर्ट कर सकता है, या बस पहले एक को रोक सकता है जो इसे पाता है। और इसके आउटपुट में अलग-अलग नोड्स के लिए xpath शामिल है, जो अच्छा है। डिफ़ॉल्ट रूप से यह अनियोजित संग्रह की अनुमति नहीं देता है, लेकिन ऐसा करने के लिए इसे कॉन्फ़िगर किया जा सकता है। विशेष अंतर हैंडलर इंजेक्ट करना (जिसे कॉल किया जाता है DifferenceListener
) आपको अनदेखा करने के आदेश सहित अंतर से निपटने के तरीके को निर्दिष्ट करने की अनुमति देता है। हालाँकि, जैसे ही आप सरलतम अनुकूलन से परे कुछ भी करना चाहते हैं, लिखना मुश्किल हो जाता है और विवरण एक विशिष्ट डोमेन ऑब्जेक्ट से बंध जाते हैं।
मेरी व्यक्तिगत प्राथमिकता सभी घोषित क्षेत्रों के माध्यम से प्रतिबिंब का उपयोग करना और हर एक में नीचे ड्रिल करना है, जैसे कि मैं जाता हूं, अंतर को ट्रैक करना। चेतावनी का शब्द: जब तक आप स्टैक ओवरफ़्लो अपवाद पसंद नहीं करते हैं, तब तक पुनरावृत्ति का उपयोग न करें। स्टैक के साथ चीजों को दायरे में रखें (a का उपयोग करेंLinkedList
या कुछ और)। मैं आमतौर पर क्षणिक और स्थिर क्षेत्रों को अनदेखा करता हूं, और मैं उन ऑब्जेक्ट जोड़े को छोड़ देता हूं, जिनकी मैंने पहले से ही तुलना की है, इसलिए मैं अनंत छोरों में अंत नहीं करता हूं अगर किसी ने स्व-संदर्भ कोड लिखने का फैसला किया (हालांकि, मैं हमेशा आदिम आवरणों की तुलना करता हूं कोई फर्क नहीं पड़ता कि क्या , क्योंकि एक ही वस्तु refs अक्सर पुन: उपयोग किया जाता है)। आप संग्रह ऑर्डर को अनदेखा करने के लिए और विशेष प्रकार या फ़ील्ड को अनदेखा करने के लिए सामने की चीज़ों को कॉन्फ़िगर कर सकते हैं, लेकिन मुझे एनोटेशन के माध्यम से फ़ील्ड पर अपनी राज्य तुलना नीतियों को परिभाषित करना पसंद है। यह, IMHO, वास्तव में एनोटेशन के लिए था, जो रनटाइम पर उपलब्ध क्लास के बारे में मेटा डेटा बनाने के लिए था। कुछ इस तरह:
@StatePolicy(unordered=true, ignore=false, exactTypesOnly=true)
private List<StringyThing> _mylist;
मुझे लगता है कि यह वास्तव में एक कठिन समस्या है, लेकिन पूरी तरह से हल करने योग्य है! और एक बार आपके पास कुछ है जो आपके लिए काम करता है, यह वास्तव में है, वास्तव में, उपयोगी है :)
इतनी अच्छी किस्मत। और अगर आप कुछ ऐसा कर रहे हैं, जो सिर्फ शुद्ध प्रतिभा है, तो शेयर करना न भूलें!