2011-08-30 19 views
6

किसी ऑब्जेक्ट की एक प्रति बनाने और उसके डेटा तक पहुंच प्राप्त करने के प्रयोजनों के लिए, बेहतर क्या है और क्यों?क्लोनिंग ऑब्जेक्ट्स

1. एक नई वस्तु बनाएं और डेटा आप

HashSet<String> myClone = new HashSet<String>(data); 

2. क्लोन वस्तु निर्माता के माध्यम से क्लोन करना चाहते हैं के रूप में के साथ प्रारंभ और प्रकार आप के लिए यह विश्वास करना यह डाली जा

HashSet<String> myClone = (HashSet<String>) data.clone(); 
+2

http://stackoverflow.com/questions/2356809/shallow-copy-of-a-map-in-java –

+2

@ मंसूर का संभावित डुप्लिकेट सही है: कॉपी कन्स्ट्रक्टर निश्चित रूप से जाने का तरीका है। – mre

+0

@mre: एक प्रतिलिपि कन्स्ट्रक्टर का उपयोग सीधे इसका मतलब है कि नई वस्तु किसी ऑब्जेक्ट की बजाय निर्दिष्ट प्रकार का ऑब्जेक्ट होगा जिसका प्रकार ऑब्जेक्ट की प्रतिलिपि बनाई जा रही है। कुछ मामलों में, यह बहुत बुरा हो सकता है। टोयोटाप्रियास पर वाहन की प्रतिलिपि बनाने वाले वाहन को वाहन से संबंधित गुणों के साथ एक वाहन मिलेगा जो कॉपी किए गए टोयोटाप्रस के उन लोगों से मेल खाता है, लेकिन मूल वाहन में किसी भी टोयोटा-प्रियस-विशिष्ट जानकारी को प्रतिलिपि में छोड़ा जाएगा। इस तरह के अर्थशास्त्र कभी-कभी वांछित हो सकते हैं, लेकिन अक्सर वांछित वांछित होगा टोयोटाप्रस जिसका गुण मूल से मेल खाता है। – supercat

उत्तर

2

निश्चित रूप से एक प्रतिलिपि का उपयोग करें - clone() वास्तव में काफी टूटा हुआ है (कम से कम अधिकांश लोग इस बात से सहमत हैं।) here विवरण के लिए देखें।

0

क्लोन डेटा की प्रतिलिपि नहीं है, यह संदर्भ (Shallow copy) की प्रतिलिपि। इसलिए, यदि आप एक गहरी "प्रतिलिपि" करना चाहते हैं और यह पहले से स्वतंत्र हो गया है, तो आपको "आइटम क्लोनिंग द्वारा आइटम" करना होगा, आमतौर पर deep copy के रूप में प्रस्तुत किया जाएगा (इसे लागू करने के कई तरीके हैं)।

इसके अलावा, आप कक्षा के clone() विधि को देख सकते हैं जो हैशसेट लागू करता है। अगर उस वर्ग ने उस विधि को ओवरराइड कर दिया है, तो यह एक गहरी प्रतिलिपि कर सकता है। मैं आपको इस पुस्तक की सिफारिश करता हूं: http://www.horstmann.com/corejava.html

1

'यह निर्भर करता है'। सभी वर्गों में कॉपी कन्स्ट्रक्टर नहीं हैं। कुछ वर्ग clone() परिभाषित करते हैं और अन्य इसे Object से प्राप्त करते हैं।

यदि आप अपनी कक्षा में कॉपी सेमेन्टिक्स को कार्यान्वित करने के बारे में सोच रहे हैं, तो कई लोग क्लोन के खिलाफ अनुशंसा करते हैं, लेकिन अन्य इसके लिए अनुशंसा करते हैं। एक तीसरा विकल्प एक स्थिर फैक्ट्री विधि है जो काम करता है।

यदि आप कुछ मौजूदा वर्ग की एक प्रति बनाने की कोशिश कर रहे हैं, तो आप मौजूदा कार्यान्वयन की करुणा पर हैं। शायद इसमें clone() है जो आप चाहते हैं, और शायद यह नहीं करता है। शायद इसमें एक प्रतिलिपि निर्माता है, शायद यह नहीं है।

संबंधित मुद्दे