2012-02-06 9 views
7
import java.util.*; 
import java.lang.*; 

public class Test{ 
    public static void main(String[] argv){ 
     String s1="abc"; 
     String s2=(String) s1.clone(); 
    }  
} 

यह सरल परीक्षण प्रोग्राम क्यों काम नहीं करता है?जावा में क्लोन()

+6

यह किस तरह से काम नहीं करता है? – Jivings

+0

थ्रेड में मुख्य "java.lang.RuntimeException: अपूर्ण स्रोत कोड - अपरिवर्तित अपवाद java.lang.CloneNotSupportedException; परीक्षण पर \t फेंकने या घोषित करने की घोषणा की जानी चाहिए। test.main (test.java:9) जावा परिणाम: 1 – user1192813

उत्तर

19

clone वस्तु वर्ग का एक तरीका है। कक्षा के लिए "क्लोनेबल" होने के लिए इसे मार्कर Cloneable इंटरफ़ेस को कार्यान्वित करना चाहिए। String कक्षा इस इंटरफ़ेस को लागू नहीं करती है और क्लोन विधि को त्रुटि को ओवरराइड नहीं करती है।

मुझे आशा है कि इसके बाद के संस्करण का टुकड़ा शैक्षिक उद्देश्यों के लिए है, क्योंकि आप जावा में तार दिया पर clone कॉल करने के लिए है कि एक की जरूरत महसूस नहीं करनी चाहिए:

जावा में
  1. स्ट्रिंग्स अपरिवर्तनीय हैं।
  2. वहां पहले से ही एक निर्माता new String(String) जो एक प्रति निर्माता की तरह काम करता है और अपने clone() कॉल करने के लिए काफी बराबर है मौजूद है तरीकों/वर्गों में उन्हें साझा करने के लिए स्वतंत्र महसूस।
+2

प्रभावी जावा आइटम 11: क्लोन को समझदारी से ओवरराइड करें। (या इससे भी बेहतर, केवल कॉपी कन्स्ट्रक्टर और क्लोन के अलावा अन्य की तरह उपयोग करें।) –

+0

हे, इस पोस्ट के लिए डाउनवोट, आंकड़े पर जाएं। –

+1

यह संकलित नहीं करता है। 'क्लोन' 'क्लोनेबल 'में सार्वजनिक विधि नहीं है, इसलिए कार्यान्वित करना इससे कोई फर्क नहीं पड़ता। –

6

Object.clone() संरक्षित है। यह उपयोग करने के लिए एक मुश्किल एपीआई है।

आमतौर पर एक clone() को उजागर करता है जब एक विधि की दृश्यता का विस्तार से वस्तु फैली हुई है।

किसी भी स्ट्रिंग पर क्लोन का कोई अर्थ नहीं है, क्योंकि यह final और अपरिवर्तनीय दोनों है।

एक स्ट्रिंग कॉपी करने के लिए एक कारण नहीं है; उस के साथ किया जा सकता है:

String s1 = ...; 
String s2 = new String(s1) 
+1

स्ट्रिंग की प्रतिलिपि बनाना दुर्लभ है, और आपने समझाया नहीं है कि क्यों कोई ([यह प्रश्न] (http://stackoverflow.com/questions/390703/what-is-the-purpose-of-the-expression -न्यू-स्ट्रिंग-इन-जावा) करता है)। –

1

clone() वस्तु वर्ग पर एक संरक्षित तरीका है। यदि आप कक्षा को क्लोन करने योग्य बनाना चाहते हैं तो सामान्य पैटर्न Cloneable को लागू करना है और उस विधि को सार्वजनिक बनाना है।

1

यह स्पष्ट रूप से संकलित नहीं किया जा सका। Object.clone ने सुरक्षित सुरक्षा प्राप्त की है।

परे वर्ग ही है और एक ही पैकेज में कोड करने के भीतर सुलभ किया जा रहा है ..., एक संरक्षित सदस्य भी एक वर्ग से वस्तु संदर्भ कम से कम एक ही प्रकार के रूप में कर रहे हैं के माध्यम से पहुँचा जा सकता है वर्ग

1

java.lang.Cloneable इंटरफ़ेस वर्ग जिसका वस्तु क्लोन हम बनाना चाहते हैं द्वारा लागू किया जाना चाहिए। हम को लागू नहीं करते हैं तो Cloneable इंटरफेस, क्लोन() विधि CloneNotSupportedException उत्पन्न करता है।

क्लोन() विधि वस्तु वर्ग में परिभाषित किया गया है।

protected Object clone() throws CloneNotSupportedException 
0

एक वर्ग के लिए होने के लिए "cloneable" यह मार्कर Cloneable इंटरफ़ेस को लागू करना चाहिए: विधि क्लोन() की सिंटेक्स इस प्रकार है। स्ट्रिंग क्लास इस इंटरफ़ेस को लागू नहीं करता है और क्लोन विधि को त्रुटि को ओवरराइड नहीं करता है।

संरक्षित ऑब्जेक्ट क्लोन() फेंकता है CloneNotSupportedException इस ऑब्जेक्ट की सटीक प्रति (क्लोन) बनाता है और देता है।

जावा में स्ट्रिंग्स अपरिवर्तनीय हैं। उन्हें विधियों/कक्षाओं में साझा करने के लिए स्वतंत्र महसूस करें पहले से ही एक कन्स्ट्रक्टर नई स्ट्रिंग (स्ट्रिंग) मौजूद है जो एक प्रतिलिपि निर्माता की तरह कार्य करता है और यह आपके क्लोन() कॉल के बराबर है।

आमतौर पर एक क्लोन() का खुलासा करता है जब कोई व्यक्ति की दृश्यता को विस्तृत करके ऑब्जेक्ट बढ़ाता है।

किसी भी स्ट्रिंग पर क्लोन का थोड़ा अर्थ नहीं है, क्योंकि यह अंतिम और अपरिवर्तनीय दोनों है।

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