क्या आपको पूरी तरह से उपयोग करना है clone
? ज्यादातर लोग सहमत हैं कि जावा clone
टूट गया है।
डिजाइन पर जोश बलोच - कॉपी कंस्ट्रक्टर बनाम क्लोनिंग
यदि आपने मेरी पुस्तक में क्लोनिंग के बारे में आइटम पढ़ा है, खासकर यदि आप लाइनों के बीच पढ़ते हैं, तो आपको पता चल जाएगा कि मुझे लगता clone
है कि गहराई से टूट गया है। [...] यह एक शर्म की बात है Cloneable
जो टूट गया है, लेकिन ऐसा होता है।
आप उनकी पुस्तक प्रभावी जावा 2 संस्करणclone
में विषय पर अधिक चर्चा पढ़ सकते हैं , आइटम 11: विवेकपूर्ण रूप से ओवरराइड करें । वह कॉपी कंस्ट्रक्टर या कॉपी फैक्ट्री का उपयोग करने के बजाय सिफारिश करता है।
उन्होंने कहा कि यदि आपको लगता है कि आप को लागू करना चाहिए, तो आप पृष्ठों के पन्नों को लिखेंगे clone
। लेकिन वह इस के साथ बंद हो गया:
क्या यह सब जटिलताएँ वास्तव में आवश्यक हैं? शायद ही कभी। यदि आप एक ऐसे वर्ग का विस्तार करते हैं जो लागू करता है Cloneable
, तो आपके पास एक अच्छा व्यवहार clone
विधि लागू करने के अलावा बहुत कम विकल्प हैं । अन्यथा, आप ऑब्जेक्ट कॉपी करने के वैकल्पिक साधन प्रदान करने, या बस क्षमता प्रदान नहीं करने से बेहतर हैं ।
जोर उसका था, मेरा नहीं।
चूंकि आपने यह स्पष्ट कर दिया है कि आपके पास इसे लागू करने के अलावा और कोई विकल्प नहीं है clone
, इसलिए इस मामले में आप क्या कर सकते हैं: यह सुनिश्चित करें MyObject extends java.lang.Object implements java.lang.Cloneable
। अगर ऐसा है, तो आप गारंटी दे सकते हैं कि आप कभी भी पकड़ नहीं पाएंगे CloneNotSupportedException
। AssertionError
जैसा कि कुछ ने सुझाव दिया है फेंकना उचित प्रतीत होता है, लेकिन आप एक टिप्पणी भी जोड़ सकते हैं जो बताती है कि इस विशेष मामले में कैच ब्लॉक को कभी दर्ज क्यों नहीं किया जाएगा ।
वैकल्पिक रूप से, जैसा कि दूसरों ने भी सुझाव दिया है, आप शायद clone
बिना बुलाए लागू कर सकते हैं super.clone
।
Cloneable
तोAssertionError
केवल एक मैदान के बजाय फेंकनाError
थोड़ा अधिक अभिव्यंजक है।