Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Java

Java में clone() मेथड का महत्व क्या है?

clone() मेथड का उपयोग किसी क्लास के ऑब्जेक्ट की कॉपी बनाने के लिए किया जाता है जो Cloneable इंटरफेस को इम्प्लीमेंट करती है। डिफ़ॉल्ट रूप से, यह फील्ड-बाय-फील्ड कॉपी करता है क्योंकि Object क्लास को उस विशेष क्लास के मेंबर्स के बारे में कोई जानकारी नहीं होती जिसके ऑब्जेक्ट्स यह मेथड कॉल करते हैं। इसलिए, यदि क्लास में केवल प्रिमिटिव डेटा टाइप के मेंबर्स हैं तो ऑब्जेक्ट की एक नई कॉपी बनाई जाएगी और नए ऑब्जेक्ट कॉपी का रेफरेंस लौटाया जाएगा। लेकिन, यदि क्लास में किसी भी क्लास टाइप के मेंबर्स हैं तो केवल उन मेंबर्स के ऑब्जेक्ट रेफरेंस कॉपी किए जाते हैं और इसलिए मूल ऑब्जेक्ट के साथ-साथ क्लोन किए गए ऑब्जेक्ट में मेंबर रेफरेंस एक ही ऑब्जेक्ट को रेफर करते हैं।

यदि हम किसी ऐसी क्लास के ऑब्जेक्ट पर clone() मेथड को कॉल करने का प्रयास करते हैं जो Cloneable इंटरफेस को इम्प्लीमेंट नहीं करती, तो हमें CloneNotSupportedException मिलेगा। यह इंटरफेस एक मार्कर इंटरफेस है और इस इंटरफेस का इम्प्लीमेंटेशन केवल यह दर्शाता है कि इम्प्लीमेंटिंग क्लास के ऑब्जेक्ट्स पर Object.clone() मेथड को कॉल किया जा सकता है।

सिंटैक्स

protected Object clone() throws CloneNotSupportedException

हम clone() मेथड को दो तरीकों से इम्प्लीमेंट कर सकते हैं

शैलो कॉपी

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

उदाहरण

public class ShallowCopyTest { 
    public static void main(String args[]) { 
        A a1 = new A(); 
        A a2 = (A) a1.clone(); 
        a1.sb.append("Tutorialspoint!"); 
        System.out.println(a1); 
        System.out.println(a2); 
    } 
} 
class A implements Cloneable { 
    public StringBuffer sb = new StringBuffer("Welcome to "); 
    public String toString() { 
        return sb.toString(); 
    } 
    public Object clone() { 
        try { 
            return super.clone(); 
        } catch(CloneNotSupportedException e) { 
        } 
        return null; 
    } 
}

आउटपुट

Welcome to Tutorialspoint! Welcome to Tutorialspoint!


डीप कॉपी

नॉन-प्रिमिटिव टाइप के मेंबर्स वाली क्लासेज के लिए clone() मेथड को ओवरराइड करके डीप कॉपी प्राप्त करने की आवश्यकता होती है क्योंकि इसमें मेंबर ऑब्जेक्ट्स को भी क्लोन करने की आवश्यकता होती है, जो डिफ़ॉल्ट क्लोनिंग तंत्र द्वारा नहीं किया जाता।

उदाहरण

public class DeepCopyTest { 
    public static void main(String args[]) { 
        A a1 = new A(); 
        A a2 = (A) a1.clone(); 
        a1.sb.append(" TutorialsPoint!"); 
        System.out.println(a1); 
        System.out.println(a2); 
    } 
} 
class A implements Cloneable { 
    public StringBuffer sb = new StringBuffer("Welcome to "); 
    public String toString() { 
        return sb.toString(); 
    } 
    public Object clone() { 
        try { 
            A a = (A) super.clone(); 
            a.sb = new StringBuffer(sb.toString()); 
            return a; 
        } catch(CloneNotSupportedException e) { 
        } 
        return null; 
    } 
}

आउटपुट

Welcome to TutorialsPoint! Welcome to

  1. - जावा में Thread क्लास का join() मेथड

    join फंक्शन - join मेथड यह सुनिश्चित करता है कि वर्तमान थ्रेड तब तक प्रतीक्षा करता है जब तक कि वह थ्रेड जिसके साथ इसे जुड़ना है, समाप्त नहीं हो जाता। यह फंक्शन तब तक प्रतीक्षा करता है जब तक कि जिस थ्रेड पर फंक्शन कॉल किया गया था, वह समाप्त नहीं हो जाता। सिंटैक्स final void join() throws Interrupte

  1. - जावा प्रोग्रामिंग में Thread क्लास का isAlive() मेथड

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

  1. Java 9 में destroyForcibly() मेथड का महत्व Java 9 में destroyForcibly() मेथड का महत्व

    Java 9 ने Process क्लास में destroyForcibly() मेथड पेश किया जो प्रक्रियाओं को बलपूर्वक समाप्त करने का एक विश्वसनीय तरीका प्रदान करता है जब सामान्य destroy() (विनम्र समाप्ति) विफल हो जाता है या बहुत धीमा होता है। destroy() बनाम destroyForcibly() पहलूdestroy()destroyForcibly() सिग्नलSIGTERM