2013-05-12 4 views
16

मैं कुछ वर्ग कोड कि Clonable लागू करता है भर में आया था, प्रलेखन राज्यों:मेरी कक्षा को क्लोनबल लागू करने में क्या बात है?

एक वर्ग Cloneable इंटरफ़ेस लागू करता Object.clone() विधि है कि यह कानूनी है कि विधि एक field- बनाने के लिए है करने के लिए इंगित करने के लिए उस वर्ग के उदाहरणों की क्षेत्रीय प्रतिलिपि। ऑब्जेक्ट की क्लोन विधि को उस उदाहरण पर आमंत्रित करना जो क्लोन करने योग्य इंटरफ़ेस परिणामों को अपवाद में लागू नहीं करता है क्लोन नॉट्स समर्थितपोर्ट अपवाद को फेंक दिया जा रहा है। सम्मेलन के अनुसार, इस इंटरफ़ेस को लागू करने वाले वर्गों को सार्वजनिक विधि के साथ ऑब्जेक्ट.क्लोन (जो संरक्षित है) को ओवरराइड करना चाहिए। इस विधि को ओवरराइड करने के विवरण के लिए ऑब्जेक्ट.क्लोन() देखें। ध्यान दें कि इस इंटरफ़ेस में क्लोन विधि नहीं है। इसलिए, इस तथ्य के आधार पर केवल एक वस्तु को क्लोन करना संभव नहीं है कि यह इस इंटरफ़ेस को लागू करता है। यहां तक ​​कि अगर क्लोन विधि को प्रतिबिंबित किया जाता है, तो इस बात की कोई गारंटी नहीं है कि यह सफल होगा।

मैं इस वर्ग को लागू करने में बिंदु को समझ सकता हूँ नहीं, के रूप में डॉक्स .clone विधि इंटरफ़ेस में लागू नहीं किया गया में कहा, और मैं इसे लागू करने के लिए की है। तो इस वर्ग का उपयोग क्यों करें? इस वर्ग के कार्यान्वयन के बिना ऑब्जेक्ट कॉपी बनाने के लिए मैं अपनी कक्षा में copyClass क्यों लिखूंगा?

अग्रिम धन्यवाद।

+1

आपने अपनी कक्षा को क्लोनेबल लागू किया है ताकि आप अंतर्निर्मित क्लोनिंग तंत्र का उपयोग कर सकें, इसलिए अन्य कक्षाएं अनन्य क्लोन विधियों को जानने के बिना आपकी क्लोन कर सकती हैं। हां, यह इसे प्रबंधित करने का एक अजीब तरीका है, लेकिन आंशिक रूप से इसे पीछे की संगतता के साथ करना है। –

उत्तर

22

क्लोन विधि को लागू करने के लिए, आप बस कार्य करें:

public Object clone() throws CloneNotSupportedException { 
    return super.clone(); 
} 

आप निश्चित रूप से अगर जरूरत एक गहरी प्रतिलिपि बनाने के लिए विधि अनुकूलित कर सकते हैं।

कॉलिंग super.clone() कॉल करना लगभग अनिवार्य है क्योंकि, जब तक कि कक्षा अंतिम नहीं होती है और इस प्रकार इसे ओवरराइड नहीं किया जा सकता है, clone() विधि को उसी वर्ग के उदाहरण को उस वस्तु के रूप में वापस करना होगा जिस पर इसे कहा जाता है। तो बस एक नया उदाहरण बनाना और राज्य की प्रतिलिपि इस वर्ग के लिए काम करेगी, लेकिन सभी उप-वर्गों के लिए नहीं। इसके अलावा, आपके पास हमेशा सुपरक्लास में निहित सभी राज्यों तक पहुंच नहीं है।

संक्षेप में, आप ऑब्जेक्ट पब्लिक की संरक्षित क्लोन विधि बनाते हैं। और पहली बात यह है कि Object.clone() विधि करता है (यह असली कोड नहीं है, लेकिन यह है कि क्या विधि करता है):

if (!(this instanceof Cloneable)) { 
    throw new CloneNotSupportedException(); 
} 

तो, Cloneable जाने के लिए Object.clone() विधि यह है कि पता है सिर्फ एक मार्कर इंटरफेस है बुलाए जाने पर अपवाद फेंकना नहीं चाहिए।

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

+0

जैसा कि मैं आपके उत्तर से समझ सकता हूं, आज इस इंटरफ़ेस का उपयोग करने की अनुशंसा नहीं की जाती है, और इसका केवल उपयोग यह है: यदि मैं ऑब्जेक्ट क्लास की क्लोन विधि का उपयोग करना चाहता हूं तो मुझे इसे कार्यान्वित करना चाहिए। मेरे मामले में (जिस कक्षा में मैंने इस कार्यान्वयन को देखा) कक्षा की एक और गहरी प्रति लागू की गई थी, इसलिए इस मामले में इस इंटरफेस को लागू करने का कोई कारण है? –

+0

यदि आप 'ऑब्जेक्ट.क्लोन()' विधि को ओवरराइड करना और उपयोग करना चाहते हैं, तो आपको इस इंटरफ़ेस को कार्यान्वित करने की आवश्यकता है। यदि आप एक प्रतिलिपि किसी अन्य तरीके से करना चाहते हैं, तो बस जो कुछ भी आप चाहते हैं उसे करें। –

+0

मिला, ऑब्जेक्ट.क्लोन() को ओवरराइड करने से मुझे इस इंटरफेस का उपयोग करने के लिए मजबूर किया गया। आपके सूचनात्मक उत्तर के लिए धन्यवाद। –

1

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

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