কম্পিউটার টিউটোরিয়াল

জাভাতে clone() মেথডের গুরুত্ব

clone() মেথডটি Cloneable ইন্টারফেস বাস্তবায়ন করা ক্লাসের অবজেক্টের একটি কপি তৈরিতে ব্যবহৃত হয়। ডিফল্টভাবে, এটি ফিল্ড-বাই-ফিল্ড কপি করে কারণ Object ক্লাসের কোনো ধারণা নেই যে কোনো নির্দিষ্ট ক্লাসের মেম্বাররা কী। তাই, যদি ক্লাসে শুধু প্রিমিটিভ ডেটা টাইপের মেম্বার থাকে, তবে অবজেক্টের একটি নতুন কপি তৈরি হয় এবং নতুন অবজেক্ট কপির রেফারেন্স রিটার্ন হয়। কিন্তু, যদি ক্লাসে কোনো ক্লাস টাইপের মেম্বার থাকে, তবে শুধু সেই মেম্বারদের অবজেক্ট রেফারেন্স কপি হয়, ফলে মূল এবং ক্লোন করা অবজেক্ট উভয়ের মেম্বার রেফারেন্স একই অবজেক্টকে নির্দেশ করে।

যদি কোনো ক্লাস Cloneable ইন্টারফেস বাস্তবায়ন না করে তার অবজেক্টে clone() মেথড কল করা হয়, তবে CloneNotSupportedException পাওয়া যায়। এই ইন্টারফেসটি একটি маркер ইন্টারফেস এবং এর বাস্তবায়ন শুধু ইঙ্গিত দেয় যে বাস্তবায়নকারী ক্লাসের অবজেক্টগুলোর ওপর Object.clone() মেথড কল করা যাবে।

সিনট্যাক্স

protected Object clone() throws CloneNotSupportedException

clone() মেথড দুটি পদ্ধতিতে বাস্তবায়ন করা যায়:

Shallow Copy (উপ ریফারেন্স কপি)

এটি Object.clone() মেথডের ডিফল্ট ক্লোনিং ফাংশনালিটির ফলাফল যদি ক্লাসে নন-প্রিমিটিভ ডেটা টাইপের মেম্বার থাকে। Shallow Copy-তে, ক্লোন করা অবজেক্টও একই অবজেক্টকে রেফার করে যেটি মূল অবজেক্ট রেফার করে, কারণ শুধু অবজেক্ট রেফারেন্সগুলো কপি হয়, রেফার করা অবজেক্টগুলো নয়।

উদাহরণ

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!

Deep Copy (গভীর কপি)

নন-প্রিমিটিভ টাইপ মেম্বারযুক্ত ক্লাসের জন্য Deep Copy অর্জনের জন্য 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. C#-এ Clone() মেথড

  2. জাভা থ্রেড ক্লাসের join() মেথড

  3. জাভা প্রোগ্রামিং-এ Thread ক্লাসের isAlive() মেথড

  4. জাভা ৯-এ destroyForcibly() মেথডের গুরুত্ব