ऑब्जेक्ट क्लोन करने के लिए मुझे 'क्लोनेबल' इंटरफ़ेस को लागू करने की आवश्यकता है। क्योंकि यहां मेरी कक्षा एक जार फ़ाइल है (मेरा मतलब एपीआई है)। इसलिए मैं कक्षा को संपादित नहीं कर सकता। मैंने सुना है कि सभी वर्ग बेस ऑब्जेक्ट क्लास को बढ़ाते हैं और यह ऑब्जेक्ट क्लास क्लोनेबल इंटरफ़ेस लागू करता है। क्या इसका मतलब यह है कि हम सीधे इंटरफ़ेस को लागू करने के साथ ऑब्जेक्ट को क्लोन कर सकते हैं। यदि ऐसा है तो मेरे ग्रहण में मुझे ऑब्जेक्ट क्लोन करने का कोई विकल्प नहीं मिल रहा है। क्लोनेबल इंटरफ़ेस लागू किए बिना ऑब्जेक्ट को क्लोन करने का कोई अन्य तरीका है। कृपया समझाएँ।ऑब्जेक्ट क्लोनिंग क्लोन करने योग्य इंटरफ़ेस
उत्तर
जावा Object
वर्ग Cloneable
इंटरफ़ेस लागू करता है नहीं करता है। हालांकि इसमें clone()
विधि है। लेकिन यह विधि protected
है और CloneNotSupportedException
फेंक देगी यदि किसी ऑब्जेक्ट पर कॉल किया गया है जो Cloneable
इंटरफ़ेस को लागू नहीं करता है। इसलिए यदि आप उस कक्षा को संशोधित नहीं कर सकते जिसे आप क्लोन करना चाहते हैं तो आप भाग्य से बाहर हैं और उदाहरण की प्रतिलिपि बनाने के लिए एक और तरीका खोजना होगा।
यह ध्यान दिया जाना चाहिए कि जावा में क्लोन सिस्टम छेद से भरा है और आमतौर पर इसका उपयोग नहीं किया जाता है। 2002 से जोश ब्लोच के साथ कुछ मुद्दों को समझाते हुए यह interview देखें।
क्लोन करने योग्य इंटरफ़ेस को लागू किए बिना ऑब्जेक्ट क्लोन करने का कोई अन्य तरीका है ... आपके उत्तर के लिए धन्यवाद – ran
"यह ध्यान दिया जाना चाहिए कि जावा में क्लोन सिस्टम छेद से भरा है और आम तौर पर अब उपयोग नहीं किया जाता है।" - क्या आप कथन के लिए संदर्भ जोड़ सकते हैं? –
आप एक कन्स्ट्रक्टर का उपयोग करके एक नया उदाहरण बना सकते हैं और आवश्यक राज्य की प्रतिलिपि बना सकते हैं। इसकी व्यवहार्यता वास्तव में उस वस्तु के वर्ग पर निर्भर करती है जिसे आप प्रतिलिपि बनाना चाहते हैं। – orien
एक वर्ग पर क्लोन विधि का आह्वान करने की कोशिश कर रहा है जो क्लोनेबल लागू नहीं करता क्लोन नॉट समर्थित अपवाद और कोई ऑब्जेक्ट क्लास क्लोनेबल लागू नहीं करता है।
यहाँ वस्तु वर्ग
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();
}
}
हाय गौरव, जैसा कि मैंने पहले ही उल्लेख किया है कि मैं अपनी कक्षा पर क्लोनेबल इंटरफेस को कार्यान्वित नहीं कर सकता। लेकिन मैं मौजूदा ऑब्जेक्ट के अलग-अलग नाम के साथ डुप्लिकेट ऑब्जेक्ट बनाना चाहता हूं। ऐसा करने के लिए कोई और रास्ता नहीं है। – ran
यदि आप पूछ रहे हैं कि क्या आप उस कक्षा के किसी ऑब्जेक्ट को क्लोन कर सकते हैं जिसे आप संपादित नहीं कर सकते हैं। जवाब न है। सैद्धांतिक रूप से, आप वर्ग के चरों तक पहुंचने के लिए प्रतिबिंब का उपयोग कर सकते हैं और इस प्रकार अपने राज्य को प्राप्त करने और दोहराने में सक्षम हो सकते हैं, लेकिन यदि आपको कक्षा के निजी सदस्यों तक पहुंचने की अनुमति है तो यह सुरक्षा प्रबंधक पर निर्भर करता है। फिर भी उस मामले में, गहरी प्रतिलिपि संभव नहीं हो सकती है। –
आपको क्लोन() 'के बजाय इस मामले में एक कॉपी कन्स्ट्रक्टर का उपयोग करना चाहिए। Google में पहला लिंक यह है: http://www.javapractices.com/topic/TopicAction.do?Id=12 – msandiford
ऑब्जेक्ट क्लास में क्लोन() विधि संरक्षित है जिसका अर्थ है कि सभी वर्ग सुरक्षित एक्सेस संशोधक के साथ इसका उत्तराधिकारी होंगे, इसलिए यदि आप उस वर्ग के बाहर इसे क्लोन करने के बिना इसे एक्सेस करने का प्रयास करते हैं तो आप इसे नहीं देख पाएंगे, यह आपको क्लोन नॉट समर्थितपोर्ट अपवाद भी फेंक देगा यदि आप क्लोनेबल इंटरफ़ेस को कार्यान्वित किए बिना इसे आमंत्रित करने का प्रयास करते हैं।
यदि आप क्लोन का व्यवहार बनाने का तरीका ढूंढ रहे हैं तो आपको अपनी कक्षा में एक नई विधि लिखनी होगी और फिर आप उसमें सभी फ़ील्ड की एक प्रति बना लेंगे, इसकी मूल रूप से एक नई प्रतिलिपि बनाना एक वस्तु की मौजूदा स्थिति।
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;
}
}
यह आमतौर पर क्लोन() से बचने के लिए वैसे भी, क्योंकि यह सही ढंग से करने के लिए मुश्किल है (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 से) द्वारा कॉपी कर सकते हैं।यह तेज़ और आसान है लेकिन सुंदर नहीं है ... मैं आम तौर पर इसे अंतिम उपाय मानता हूं।
हाय केली। आपके जवाब के लिए धन्यवाद। लेकिन मैं इस बारे में बिल्कुल समझ में नहीं आया। क्या आप कृपया मुझे अपने मामले में बता सकते हैं कि मैं इसे कैसे कर सकता हूं। – ran
एक कॉपी कन्स्ट्रक्टर इस तरह दिखेगा: सार्वजनिक XYZ (XYZ toCopy)। O.clone() को कॉल करने के बजाय, आप नए XYZ (ओ) को कॉल करेंगे। धारावाहिक भाग का अर्थ है कि यदि XYZ को स्ट्रीम में लिखा जा सकता है, तो आप इसे एक स्ट्रीम (वास्तव में केवल स्मृति में बाइट्स की एक सरणी) में लिख सकते हैं और फिर इसे उस स्ट्रीम से वापस पढ़ सकते हैं, प्रभावी रूप से एक प्रति बनाते हैं। – kylewm
एक कॉपी कन्स्ट्रक्टर की सीमा यह है कि आपको कोड संलेखन समय पर कक्षा प्रकार को जानने की आवश्यकता है। 'XYZ' के उप-वर्ग में पास होने पर सार्वजनिक XYZ (toCopy) 'काम नहीं करेगा। –
उनका एक एपीआई है जो क्लोन करने योग्य इंटरफेस को लागू किए बिना ऑब्जेक्ट क्लोन करता है।
इस
https://code.google.com/p/cloning/
प्रयास करें इसके अलावा आप यहां
http://javatechniques.com/blog/faster-deep-copies-of-java-objects/
क्लोनिंग वस्तुओं के बारे में और अधिक जानकारी प्राप्त कर सकते हैं यह एक वस्तु का एक क्लोन बनाने के लिए cloneable इंटरफ़ेस को लागू करने अनिवार्य नहीं है। आप उस वर्ग में अपनी क्लोन विधि लिख सकते हैं जिसका ऑब्जेक्ट आप क्लोन करना चाहते हैं।
यह प्रश्न का उत्तर नहीं प्रदान करता है। एक बार आपके पास पर्याप्त [प्रतिष्ठा] (https://stackoverflow.com/help/whats-reputation) हो जाने पर आप [किसी भी पोस्ट पर टिप्पणी कर सकेंगे] (https://stackoverflow.com/help/privileges/comment); इसके बजाय, [उन उत्तरों को प्रदान करें जिन्हें पूछताछ से स्पष्टीकरण की आवश्यकता नहीं है] (https: //meta.stackexchange।com/प्रश्न/214,173/क्यों करते हैं-ए-जरूरत-50-प्रतिष्ठा करने वाली टिप्पणी-क्या-कर सकते हैं-ए-do-बजाय)। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाले पदों/18867158) –
- 1. क्लोन() ऑब्जेक्ट को क्लोन करने का क्या अर्थ है?
- 2. CloneNotSupportedException क्लोन करने योग्य
- 3. क्लोन करने योग्य इंटरफ़ेस में #clone() क्यों नहीं है?
- 4. क्लोनिंग dom.Document ऑब्जेक्ट
- 5. PHP में ऑब्जेक्ट क्लोनिंग क्या है?
- 6. क्लोनिंग ऑब्जेक्ट्स
- 7. जावा में कक्षाएं डिफ़ॉल्ट रूप से क्लोन करने योग्य नहीं हैं
- 8. NHibernate में ऑब्जेक्ट क्लोन कैसे करें?
- 9. heroku क्लोनिंग
- 10. क्यूओब्जेक्ट क्लोनिंग
- 11. PHP गहरी क्लोन ऑब्जेक्ट
- 12. क्लोनिंग गिट रेपो
- 13. क्लोनिंग ऑब्जेक्ट्स?
- 14. jQuery क्लोन() ईवेंट बाइंडिंग क्लोनिंग नहीं, यहां तक कि()
- 15. क्लोन() विधि
- 16. दीप क्लोनिंग मूस वस्तु
- 17. जावा में क्लोनिंग इटरेटर्स
- 18. जावा कस्टम क्लोनिंग
- 19. क्लोनिंग लुआ राज्य
- 20. गहरे क्लोनिंग के लिए यूनिट परीक्षण
- 21. फास्ट डिस्क क्लोनिंग
- 22. सॉर्ट करने योग्य क्लोन सहायक काम नहीं कर रहा
- 23. क्लोनिंग डेटपिकर ऑब्जेक्ट्स [JQuery]
- 24. निष्पादन योग्य और स्थानांतरित करने योग्य ऑब्जेक्ट फ़ाइल में संदेह
- 25. डिफ़ॉल्ट इंटरफ़ेस ऑब्जेक्ट
- 26. 'प्रबंधक' ऑब्जेक्ट कॉल करने योग्य नहीं है
- 27. 'यूनिकोड' ऑब्जेक्ट कॉल करने योग्य नहीं है
- 28. सीरियलाइजेशन के बिना क्लोनिंग ऑब्जेक्ट्स
- 29. तेज़ गहरे क्लोनिंग
- 30. क्लोनिंग सूची <T>
आपको ऐसा क्यों लगता है कि आपको यह करना होगा? आप प्रोग्रामिंग चरणों के बजाए हल करने की कोशिश कर रहे समग्र समस्या को बताकर बेहतर हो सकते हैं जो आपको लगता है कि इसे हल करने के लिए आवश्यक हो सकता है। दूसरे शब्दों में, आप सब कुछ गलत के बारे में जा रहे हैं। –
उत्तर में टिप्पणियों के अनुसार, मुझे लगता है कि ओपी एक कॉपी कन्स्ट्रक्टर चाहता है। – msandiford
हाय होवरक्राफ्ट। यहां मैं अपनी समस्या स्पष्ट रूप से समझा रहा हूं। मेरे पास XYZ नामक एक वर्ग है और मेरे पास एक तरीका है जो इस XYZ कक्षा का ऑब्जेक्ट देता है। निजी XYZ getObject() {वापसी obj; } और मैंने इस विधि को कॉल करके एक ऑब्जेक्ट बनाया है। XYZ obj1 = getObject(); यहाँ समस्या आती है। असल में मैं फिर से विधि को कॉल करने के साथ एक और ऑब्जेक्ट बनाना चाहता हूं। और मैं यहां XYZ कक्षा को संपादित नहीं कर सकता। मैं XYZ obj2 = (XYZ) obj1.clone() करना चाहता था; लेकिन मैं अपने XYZ कक्षा पर 'क्लोनेबल' इंटरफ़ेस को लागू नहीं कर सकता। तो क्या इस वर्ग के लिए एक और वस्तु बनाने का कोई और तरीका है। – ran