क्लोन विधि और क्लोन करने योग्य इंटरफ़ेस - 1

"हाय, अमीगो!"

"हाय, किम।"

"मैं आपको क्लोन () विधि के बारे में बताने जा रहा हूँ।"

"इस पद्धति का बिंदु किसी वस्तु का क्लोन बनाना है, या दूसरे शब्दों में, वस्तु का क्लोन/प्रतिलिपि/डुप्लिकेट बनाना है।"

"जब इस विधि को कॉल किया जाता है, तो जावा वर्चुअल मशीन उस ऑब्जेक्ट का डुप्लिकेट बनाता है और वापस करता है जिस पर इसे कॉल किया जाता है।

क्लोन विधि का ऑब्जेक्ट वर्ग का कार्यान्वयन बहुत ही आदिम है: केवल एक नई वस्तु बनाई जाती है, और मूल वस्तु के क्षेत्रों के मान उसके क्षेत्रों को सौंपे जाते हैं।

यदि कॉपी की गई वस्तु में अन्य वस्तुओं के संदर्भ हैं, तो उन संदर्भों की प्रतिलिपि बनाई जाएगी। उन वस्तुओं के डुप्लिकेट नहीं बनाए जाएंगे।"

"हम्म। यह आगे बढ़ने के लिए बहुत कुछ नहीं है।"

"बात यह है कि जावा वर्चुअल मशीन नहीं जानती है कि कौन सी वस्तुओं को क्लोन किया जा सकता है या नहीं। उदाहरण के लिए, फाइलों को क्लोन नहीं किया जा सकता है। यही बात System.in स्ट्रीम के लिए भी सही है।"

"तो, पूर्ण क्लोनिंग का सवाल एक वर्ग के डेवलपर्स के लिए थपथपाया गया था।" यह सब समान है कि कैसे समान पद्धति को संभाला जाता है। हैशकोड की तुलना में कुछ भी है: क्लोन करने योग्य इंटरफ़ेस।"

" क्लोनेबल इंटरफ़ेस को 'मार्कर इंटरफ़ेस' कहा जाता है: इसमें कोई तरीका नहीं है और इसका उपयोग कुछ वर्गों को चिह्नित करने के लिए किया जाता है।

"यदि किसी वर्ग के डेवलपर का मानना ​​​​है कि वर्ग की वस्तुओं को क्लोन किया जा सकता है, तो वह इसे इस इंटरफ़ेस के साथ चिह्नित करता है (यानी कक्षा को क्लोन करने योग्य बनाता है)।"

"यदि डेवलपर क्लोन विधि के मानक कार्यान्वयन को पसंद नहीं करता है, तो उसे अपना खुद का लिखना होगा जो एक डुप्लिकेट ऑब्जेक्ट को सही तरीके से बनाएगा।"

"जब आप क्लोन () मेथड को कॉल करते हैं, तो जावा यह जांचता है कि क्या ऑब्जेक्ट क्लोन करने योग्य इंटरफ़ेस का समर्थन करता है। यदि ऐसा होता है, तो यह क्लोन ( ) मेथड का उपयोग करके ऑब्जेक्ट को क्लोन करता है; यदि नहीं, तो यह CloneNotSupportedException को फेंकता है।"

"दूसरे शब्दों में, हमें या तो क्लोन विधि को ओवरराइड करना चाहिए या क्लास को क्लोनेबल लागू करना चाहिए?"

"हाँ, लेकिन आपको अभी भी विधि को ओवरराइड करना होगा। क्लोन() विधि को संरक्षित घोषित किया गया है, इसलिए इसे केवल इसके पैकेज (java.lang.*) या उनके उपवर्गों में कक्षाओं द्वारा बुलाया जा सकता है।"

"मैं थोड़ा भ्रमित हूँ - तो मुझे किसी वस्तु का क्लोन बनाने के लिए क्या करने की आवश्यकता है?"

"यदि आप ऑब्जेक्ट क्लास की «डिफ़ॉल्ट» क्लोनिंग विधि का उपयोग करना चाहते हैं, तो आपको इसकी आवश्यकता है:

" ए) अपनी कक्षा में क्लोन करने योग्य इंटरफ़ेस जोड़ें"

" बी) क्लोन विधि को ओवरराइड करें और अपने कार्यान्वयन के भीतर सुपरक्लास के कार्यान्वयन को कॉल करें:"

class Point implements Cloneable
{
 int x;
 int y;

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

"या आप क्लोन विधि का कार्यान्वयन पूरी तरह से अपने दम पर लिख सकते हैं:"

class Point
{
 int x;
 int y;

 public Object clone()
 {
  Point point = new Point();
  point.x = this.x;
  point.y = this.y;
  return point;
 }
}

"यह एक दिलचस्प तरीका है। मुझे यकीन है कि मैं इसका इस्तेमाल करूंगा। कभी-कभी ..."