2011-11-19 15 views
11

ऑब्जेक्ट क्लोन करने के लिए मुझे 'क्लोनेबल' इंटरफ़ेस को लागू करने की आवश्यकता है। क्योंकि यहां मेरी कक्षा एक जार फ़ाइल है (मेरा मतलब एपीआई है)। इसलिए मैं कक्षा को संपादित नहीं कर सकता। मैंने सुना है कि सभी वर्ग बेस ऑब्जेक्ट क्लास को बढ़ाते हैं और यह ऑब्जेक्ट क्लास क्लोनेबल इंटरफ़ेस लागू करता है। क्या इसका मतलब यह है कि हम सीधे इंटरफ़ेस को लागू करने के साथ ऑब्जेक्ट को क्लोन कर सकते हैं। यदि ऐसा है तो मेरे ग्रहण में मुझे ऑब्जेक्ट क्लोन करने का कोई विकल्प नहीं मिल रहा है। क्लोनेबल इंटरफ़ेस लागू किए बिना ऑब्जेक्ट को क्लोन करने का कोई अन्य तरीका है। कृपया समझाएँ।ऑब्जेक्ट क्लोनिंग क्लोन करने योग्य इंटरफ़ेस

+1

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

+0

उत्तर में टिप्पणियों के अनुसार, मुझे लगता है कि ओपी एक कॉपी कन्स्ट्रक्टर चाहता है। – msandiford

+0

हाय होवरक्राफ्ट। यहां मैं अपनी समस्या स्पष्ट रूप से समझा रहा हूं। मेरे पास XYZ नामक एक वर्ग है और मेरे पास एक तरीका है जो इस XYZ कक्षा का ऑब्जेक्ट देता है। निजी XYZ getObject() {वापसी obj; } और मैंने इस विधि को कॉल करके एक ऑब्जेक्ट बनाया है। XYZ obj1 = getObject(); यहाँ समस्या आती है। असल में मैं फिर से विधि को कॉल करने के साथ एक और ऑब्जेक्ट बनाना चाहता हूं। और मैं यहां XYZ कक्षा को संपादित नहीं कर सकता। मैं XYZ obj2 = (XYZ) obj1.clone() करना चाहता था; लेकिन मैं अपने XYZ कक्षा पर 'क्लोनेबल' इंटरफ़ेस को लागू नहीं कर सकता। तो क्या इस वर्ग के लिए एक और वस्तु बनाने का कोई और तरीका है। – ran

उत्तर

5

जावा Object वर्ग Cloneable इंटरफ़ेस लागू करता है नहीं करता है। हालांकि इसमें clone() विधि है। लेकिन यह विधि protected है और CloneNotSupportedException फेंक देगी यदि किसी ऑब्जेक्ट पर कॉल किया गया है जो Cloneable इंटरफ़ेस को लागू नहीं करता है। इसलिए यदि आप उस कक्षा को संशोधित नहीं कर सकते जिसे आप क्लोन करना चाहते हैं तो आप भाग्य से बाहर हैं और उदाहरण की प्रतिलिपि बनाने के लिए एक और तरीका खोजना होगा।

यह ध्यान दिया जाना चाहिए कि जावा में क्लोन सिस्टम छेद से भरा है और आमतौर पर इसका उपयोग नहीं किया जाता है। 2002 से जोश ब्लोच के साथ कुछ मुद्दों को समझाते हुए यह interview देखें।

+0

क्लोन करने योग्य इंटरफ़ेस को लागू किए बिना ऑब्जेक्ट क्लोन करने का कोई अन्य तरीका है ... आपके उत्तर के लिए धन्यवाद – ran

+0

"यह ध्यान दिया जाना चाहिए कि जावा में क्लोन सिस्टम छेद से भरा है और आम तौर पर अब उपयोग नहीं किया जाता है।" - क्या आप कथन के लिए संदर्भ जोड़ सकते हैं? –

+0

आप एक कन्स्ट्रक्टर का उपयोग करके एक नया उदाहरण बना सकते हैं और आवश्यक राज्य की प्रतिलिपि बना सकते हैं। इसकी व्यवहार्यता वास्तव में उस वस्तु के वर्ग पर निर्भर करती है जिसे आप प्रतिलिपि बनाना चाहते हैं। – orien

0

एक वर्ग पर क्लोन विधि का आह्वान करने की कोशिश कर रहा है जो क्लोनेबल लागू नहीं करता क्लोन नॉट समर्थित अपवाद और कोई ऑब्जेक्ट क्लास क्लोनेबल लागू नहीं करता है।

यहाँ वस्तु वर्ग

CloneNotSupportedException if the object's class does not 
*    support the <code>Cloneable</code> interface. Subclasses 
*    that override the <code>clone</code> method can also 
*    throw this exception to indicate that an instance cannot 
*    be cloned. 

भी वस्तु # क्लोन विधि सुरक्षित है तो आप अपने वर्ग में क्लोन विधि को लागू करने और इसे जनता तो यह करने के लिए सुलभ हो सकता है बनाने की जरूरत है की क्लोन विधि से जावाडोक है कक्षाएं आपकी कक्षा की वस्तुओं को बनाती हैं जो क्लोन का आह्वान कर सकती हैं। एक अच्छा उदाहरण है, java.io.Serializable

है जिस तरह क्लोन ArrayList

ArrayList में लागू किया जाता है cloneable लागू करता सार्वजनिक वर्ग ArrayList नीचे विस्तारित होती है AbstractList लागू करता है सूची, RandomAccess, Cloneable और फिर क्लोन विधि लागू करता है:

/** 
* Returns a shallow copy of this <tt>ArrayList</tt> instance. (The 
* elements themselves are not copied.) 
* 
* @return a clone of this <tt>ArrayList</tt> instance 
*/ 
public Object clone() { 
try { 
    ArrayList<E> v = (ArrayList<E>) super.clone(); 
    v.elementData = Arrays.copyOf(elementData, size); 
    v.modCount = 0; 
    return v; 
} catch (CloneNotSupportedException e) { 
    // this shouldn't happen, since we are Cloneable 
    throw new InternalError(); 
} 
} 
+0

हाय गौरव, जैसा कि मैंने पहले ही उल्लेख किया है कि मैं अपनी कक्षा पर क्लोनेबल इंटरफेस को कार्यान्वित नहीं कर सकता। लेकिन मैं मौजूदा ऑब्जेक्ट के अलग-अलग नाम के साथ डुप्लिकेट ऑब्जेक्ट बनाना चाहता हूं। ऐसा करने के लिए कोई और रास्ता नहीं है। – ran

+0

यदि आप पूछ रहे हैं कि क्या आप उस कक्षा के किसी ऑब्जेक्ट को क्लोन कर सकते हैं जिसे आप संपादित नहीं कर सकते हैं। जवाब न है। सैद्धांतिक रूप से, आप वर्ग के चरों तक पहुंचने के लिए प्रतिबिंब का उपयोग कर सकते हैं और इस प्रकार अपने राज्य को प्राप्त करने और दोहराने में सक्षम हो सकते हैं, लेकिन यदि आपको कक्षा के निजी सदस्यों तक पहुंचने की अनुमति है तो यह सुरक्षा प्रबंधक पर निर्भर करता है। फिर भी उस मामले में, गहरी प्रतिलिपि संभव नहीं हो सकती है। –

+0

आपको क्लोन() 'के बजाय इस मामले में एक कॉपी कन्स्ट्रक्टर का उपयोग करना चाहिए। Google में पहला लिंक यह है: http://www.javapractices.com/topic/TopicAction.do?Id=12 – msandiford

0

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

यदि आप क्लोन का व्यवहार बनाने का तरीका ढूंढ रहे हैं तो आपको अपनी कक्षा में एक नई विधि लिखनी होगी और फिर आप उसमें सभी फ़ील्ड की एक प्रति बना लेंगे, इसकी मूल रूप से एक नई प्रतिलिपि बनाना एक वस्तु की मौजूदा स्थिति।

public class TestCloneable { 
private String name = null; 

/** 
* @param name the name to set 
*/ 
public void setName(String name) { 
    this.name = name; 
} 

/** 
* @return the name 
*/ 
public String getName() { 
    return name; 
} 


public TestCloneable createCopy(){ 
    TestCloneable testCloneable = new TestCloneable(); 
    testCloneable.setName(this.getName()); 
    return testCloneable; 
} 

}

5

यह आमतौर पर क्लोन() से बचने के लिए वैसे भी, क्योंकि यह सही ढंग से करने के लिए मुश्किल है (http://www.javapractices.com/topic/TopicAction.do?Id=71) अच्छी आदत है। शायद प्रश्न में कक्षा में एक कॉपी कन्स्ट्रक्टर है?

वैकल्पिक रूप से अगर यह Serializable या Externalizable लागू करता है, आप गहरी यह एक बाइट स्ट्रीम पर लेखन और

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream(baos); 
oos.writeObject(this); 
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); 
ObjectInputStream ois = new ObjectInputStream(bais); 
Object deepCopy = ois.readObject(); 

में इसे वापस पढ़ने (http://www.jguru.com/faq/view.jsp?EID=20435 से) द्वारा कॉपी कर सकते हैं।यह तेज़ और आसान है लेकिन सुंदर नहीं है ... मैं आम तौर पर इसे अंतिम उपाय मानता हूं।

+0

हाय केली। आपके जवाब के लिए धन्यवाद। लेकिन मैं इस बारे में बिल्कुल समझ में नहीं आया। क्या आप कृपया मुझे अपने मामले में बता सकते हैं कि मैं इसे कैसे कर सकता हूं। – ran

+0

एक कॉपी कन्स्ट्रक्टर इस तरह दिखेगा: सार्वजनिक XYZ (XYZ toCopy)। O.clone() को कॉल करने के बजाय, आप नए XYZ (ओ) को कॉल करेंगे। धारावाहिक भाग का अर्थ है कि यदि XYZ को स्ट्रीम में लिखा जा सकता है, तो आप इसे एक स्ट्रीम (वास्तव में केवल स्मृति में बाइट्स की एक सरणी) में लिख सकते हैं और फिर इसे उस स्ट्रीम से वापस पढ़ सकते हैं, प्रभावी रूप से एक प्रति बनाते हैं। – kylewm

+0

एक कॉपी कन्स्ट्रक्टर की सीमा यह है कि आपको कोड संलेखन समय पर कक्षा प्रकार को जानने की आवश्यकता है। 'XYZ' के उप-वर्ग में पास होने पर सार्वजनिक XYZ (toCopy) 'काम नहीं करेगा। –

0

क्लोनिंग वस्तुओं के बारे में और अधिक जानकारी प्राप्त कर सकते हैं यह एक वस्तु का एक क्लोन बनाने के लिए cloneable इंटरफ़ेस को लागू करने अनिवार्य नहीं है। आप उस वर्ग में अपनी क्लोन विधि लिख सकते हैं जिसका ऑब्जेक्ट आप क्लोन करना चाहते हैं।

+1

यह प्रश्न का उत्तर नहीं प्रदान करता है। एक बार आपके पास पर्याप्त [प्रतिष्ठा] (https://stackoverflow.com/help/whats-reputation) हो जाने पर आप [किसी भी पोस्ट पर टिप्पणी कर सकेंगे] (https://stackoverflow.com/help/privileges/comment); इसके बजाय, [उन उत्तरों को प्रदान करें जिन्हें पूछताछ से स्पष्टीकरण की आवश्यकता नहीं है] (https: //meta.stackexchange।com/प्रश्न/214,173/क्यों करते हैं-ए-जरूरत-50-प्रतिष्ठा करने वाली टिप्पणी-क्या-कर सकते हैं-ए-do-बजाय)। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाले पदों/18867158) –

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