2015-07-16 7 views
11

हाल ही में मैं एक साक्षात्कार में यह सवाल का सामना करना पड़ा:जावा में संग्रह की गहरी क्लोनिंग

एक समारोह लिखें वर्ग आहरण की गहरी क्लोन उदाहरण वापस जाने के लिए

public class Drawing{ 

    public List<Shape> shapes=new LinkedList<Shape>(); 

} 

जहां आकार कई ठोस होने एक अमूर्त वर्ग है कार्यान्वयन

public abstract class Shape implements Serializable{ 

} 

क्या कोई कृपया यह बता सकता है कि इस तक कैसे पहुंचे? क्या हमें सभी ठोस कार्यान्वयन में क्लोन विधि जोड़ने की आवश्यकता है?

+8

तथ्य यह है कि आकार Serializable लागू करता है एक संकेत है। साक्षात्कारकर्ता शायद आपको उम्मीद है कि आप सूची को क्रमबद्ध करें और इसे deserialize करें, और deserialized सूची का संदर्भ देने के लिए एक नया ड्राइंग उदाहरण बनाने के लिए। –

+3

@JBNizet दूसरी तरफ यदि आकार में क्षणिक क्षेत्र हैं, तो वे धारावाहिकरण के दौरान खो जाएंगे, लेकिन वस्तुओं को क्लोन किए जाने पर खो नहीं जाएगा। – AdamSkywalker

+0

जांचें कि क्या यह मदद करेगा http://stackoverflow.com/questions/64036/how-do-you-make-a-deep-copy-of-an-object-in-java – Ravi

उत्तर

3

आप पहली बार List<Shape> को क्रमानुसार और फिर deserialize और deserialized List

public static Drawing deepClone(Drawing drawing) { 
    try { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(baos); 
     oos.writeObject(drawing.shapes); //Serializes the drawing.shapes 

     ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); 
     ObjectInputStream ois = new ObjectInputStream(bais); 
     return new Drawing((LinkedList<Shape>)ois.readObject()); //Deserializing and reading 
    } catch (IOException e) { 
     return null; 
    } catch (ClassNotFoundException e) { 
     return null; 
    } 
} 

साथ Drawing का एक नया उदाहरण वापसी मान लिया जाये कि आप ड्राइंग में एक निर्माता है, जिसमें लगता है है क्या करने की जरूरत LinkedList<Shape> पैरामीटर

EDIT

जब आप Cloneable इंटरफ़ेस को लागू है, लेकिन सवाल के अनुसार, वे आपको Serializable इंटरफ़ेस का उपयोग कर क्लोन बनाना चाहते हैं आकार कक्षा में clone() जोड़ने के लिए के रूप में आप clone() विधि ओवरराइड जरूरत नहीं होगी।

+0

संपादित यह एक अच्छा जवाब है, लेकिन मुझे लगता है कि यह 'Shape' उपवर्गों की' transient' क्षेत्रों के बारे में कुछ कहना चाहिए, यदि कोई हो। इस मामले में, गहरे क्लोनिंग इन क्षेत्रों पर लागू नहीं होंगे। मेरा मतलब है, एक साक्षात्कार के सवाल में, शायद ओपी को इसका जिक्र करना चाहिए और यह स्पष्ट करना चाहिए कि यह भुगतान करने के लिए व्यापार-बंद है। –

0

प्रत्येक उप वर्ग Shape जानता है कि खुद की एक गहरी प्रति कैसे बनाएं, क्योंकि यह एक बात है Serializable कार्यान्वयन करना चाहिए। तो सूची में Drawing में सूची को दोहराएं और सूची में प्रत्येक Shape की अपनी गहरी प्रतिलिपि बनाने के लिए Shape ऑब्जेक्ट को क्रमबद्ध/deserialize करें।

+0

सूची में फिर से क्यों चलें और क्रमबद्ध करें ' एक के आकार का आकार? 'लिंक्डलिस्ट' भी 'Serializable' है, इसलिए सूची को क्रमबद्ध और deserializing पर्याप्त है। –

0

आप use a library भी कर सकते हैं जो serialization विधियों से तेज़ है।

Cloner cloner=new Cloner(); 

MyClass clone=cloner.deepClone(o); 
// clone is a deep-clone of o 
+0

मुझे लगता है कि उसे पुस्तकालय का उपयोग करने के बजाय Serializable का उपयोग करके इसे कैसे करना है क्योंकि यह एक साक्षात्कार प्रश्न है और वह साक्षात्कार में सीधे लाइब्रेरी नहीं कह सकता है। – Sneh

+0

क्यों नहीं? मुझे लगता है कि लाइब्रेरी का उपयोग करने का सुझाव देना चालाक है। ओपी को केवल इसलिए समझने की जरूरत है कि वह इसे क्यों चुनेगा (यानी।कैसे क्रमबद्धता तरीकों से काम करता है) – Machado

0

मैं Apach कॉमन्स लैंग से SerializationUtils.clone का उपयोग कर

इस विधि सुझाव है कि गहरी क्लोनिंग के लिए है:

SomeObject cloned = org.apache.commons.lang.SerializationUtils.clone(someObject); 

यह वस्तुओं क्लोन करने के लिए नहीं बल्कि अगर आप के लिए देखो एक आसान तरीका है प्रदर्शन।

See documentation

+1

यह एक जवाब नहीं है ... कृपया बताएं कि आप क्यों सुझाव है कि, लाभ और इसे प्रयोग की कमियां। शायद यह भी पता चलता है कि कुछ उदाहरण कोड – Mackiavelli

+0

सिर्फ मेरा उत्तर – JavaDev

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