खोज…


टिप्पणियों

क्लोनिंग मुश्किल हो सकता है, खासकर जब ऑब्जेक्ट के फ़ील्ड अन्य ऑब्जेक्ट को पकड़ते हैं। ऐसी स्थितियाँ हैं जहाँ आप केवल क्षेत्र मूल्यों (यानी अन्य वस्तुओं के संदर्भ) की प्रतिलिपि बनाने के बजाय एक गहरी प्रतिलिपि बनाना चाहते हैं।

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

क्लोनिंग की कार्यक्षमता प्रदान करने के लिए एक बेहतर समाधान एक कॉपी कंस्ट्रक्टर या कॉपी फैक्ट्री प्रदान करना हैयहोशू बलोच के प्रभावी जावा आइटम 11 का संदर्भ लें: स्पष्ट रूप से क्लोन को ओवरराइड करें।

एक कॉपी कंस्ट्रक्टर का उपयोग करके क्लोनिंग

कॉपी कंस्ट्रक्टर को लागू करने से किसी ऑब्जेक्ट को क्लोन करने का एक आसान तरीका है।

public class Sheep {

    private String name;

    private int weight;

    public Sheep(String name, int weight) {
        this.name = name;
        this.weight = weight;
    }

    // copy constructor
    // copies the fields of other into the new object
    public Sheep(Sheep other) {
        this.name = other.name;
        this.weight = other.weight;
    }

}

// create a sheep
Sheep sheep = new Sheep("Dolly", 20);
// clone the sheep
Sheep dolly = new Sheep(sheep); // dolly.name is "Dolly" and dolly.weight is 20

क्लोन करने योग्य इंटरफ़ेस को लागू करके क्लोनिंग

क्लोन करने योग्य इंटरफ़ेस को लागू करके किसी ऑब्जेक्ट को क्लोन करना।

public class Sheep implements Cloneable {

    private String name;

    private int weight;

    public Sheep(String name, int weight) {
        this.name = name;
        this.weight = weight;
    }

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

}

// create a sheep
Sheep sheep = new Sheep("Dolly", 20);
// clone the sheep
Sheep dolly =  (Sheep) sheep.clone(); // dolly.name is "Dolly" and dolly.weight is 20

एक उथले प्रति प्रदर्शन क्लोनिंग

किसी ऑब्जेक्ट की क्लोनिंग करते समय डिफ़ॉल्ट व्यवहार ऑब्जेक्ट के फ़ील्ड की उथली प्रतिलिपि निष्पादित करना है। उस स्थिति में, मूल वस्तु और क्लोन ऑब्जेक्ट दोनों, एक ही ऑब्जेक्ट के संदर्भ को रखते हैं।

यह उदाहरण उस व्यवहार को दर्शाता है।

import java.util.List;

public class Sheep implements Cloneable {

    private String name;

    private int weight;

    private List<Sheep> children;

    public Sheep(String name, int weight) {
        this.name = name;
        this.weight = weight;
    }

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

    public List<Sheep> getChildren() {
        return children;
    }

    public void setChildren(List<Sheep> children) {
        this.children = children;
    }

}

import java.util.Arrays;
import java.util.List;

// create a sheep
Sheep sheep = new Sheep("Dolly", 20);

// create children
Sheep child1 = new Sheep("Child1", 4);
Sheep child2 = new Sheep("Child2", 5);

sheep.setChildren(Arrays.asList(child1, child2));

// clone the sheep
Sheep dolly =  (Sheep) sheep.clone();
List<Sheep> sheepChildren = sheep.getChildren();
List<Sheep> dollysChildren = dolly.getChildren();
for (int i = 0; i < sheepChildren.size(); i++) {
    // prints true, both arrays contain the same objects
    System.out.println(sheepChildren.get(i) == dollysChildren.get(i));
}

क्लोनिंग एक गहरी प्रति प्रदर्शन

नेस्टेड ऑब्जेक्ट्स की प्रतिलिपि बनाने के लिए, एक गहरी प्रतिलिपि निष्पादित की जानी चाहिए, जैसा कि इस उदाहरण में दिखाया गया है।

import java.util.ArrayList;
import java.util.List;

public class Sheep implements Cloneable {

    private String name;

    private int weight;

    private List<Sheep> children;

    public Sheep(String name, int weight) {
        this.name = name;
        this.weight = weight;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        Sheep clone = (Sheep) super.clone();
        if (children != null) {
            // make a deep copy of the children
            List<Sheep> cloneChildren = new ArrayList<>(children.size());
            for (Sheep child : children) {
                cloneChildren.add((Sheep) child.clone());
            }
            clone.setChildren(cloneChildren);
        }
        return clone;
    }

    public List<Sheep> getChildren() {
        return children;
    }

    public void setChildren(List<Sheep> children) {
        this.children = children;
    }

}

import java.util.Arrays;
import java.util.List;

// create a sheep
Sheep sheep = new Sheep("Dolly", 20);

// create children
Sheep child1 = new Sheep("Child1", 4);
Sheep child2 = new Sheep("Child2", 5);

sheep.setChildren(Arrays.asList(child1, child2));

// clone the sheep
Sheep dolly =  (Sheep) sheep.clone();
List<Sheep> sheepChildren = sheep.getChildren();
List<Sheep> dollysChildren = dolly.getChildren();
for (int i = 0; i < sheepChildren.size(); i++) {
    // prints false, both arrays contain copies of the objects inside
    System.out.println(sheepChildren.get(i) == dollysChildren.get(i));
}

एक कॉपी कारखाने का उपयोग करके क्लोनिंग

public class Sheep {

    private String name;
    
    private int weight;
    
    public Sheep(String name, int weight) {
        this.name = name;
        this.weight = weight;
    }
    
    public static Sheep newInstance(Sheep other);
        return new Sheep(other.name, other.weight)
    }

}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow