दो लोकप्रिय दृष्टिकोण हैं। एक जैसा कि आपने उल्लेख किया है, clone
विधि प्रदान करना है।
public class C implements Cloneable {
@Override public C clone() {
try {
final C result = (C) super.clone();
// copy fields that need to be copied here!
return result;
} catch (final CloneNotSupportedException ex) {
throw new AssertionError();
}
}
"कॉपी फ़ील्ड ... यहां पर ध्यान दें!" अंश। प्रारंभिक result
केवल एक उथली प्रतिलिपि है, जिसका अर्थ है कि यदि किसी ऑब्जेक्ट का संदर्भ है, तो मूल और result
दोनों एक ही ऑब्जेक्ट को साझा करेंगे। उदाहरण के लिए, यदि C
में private int[] data
है तो आप शायद इसकी प्रतिलिपि बनाना चाहते हैं।
...
final C result = (C) super.clone();
result.data = data.clone();
return result;
...
ध्यान दें कि आप आदिम क्षेत्रों कॉपी करने के लिए, के रूप में अपनी सामग्री को पहले से ही नकल की जाती है या अपरिवर्तनीय वस्तुओं, वे वैसे भी नहीं बदल सकते हैं के रूप में की जरूरत नहीं है।
दूसरा दृष्टिकोण प्रतिलिपि बनाने वाला है।
public class C {
public C(final C c) {
// initialize this with c
}
}
या एक प्रति कारखाना।
public class C {
public static C newInstance(final C c) {
return new C(c);
}
private C(final C c) {
// initialize this with c
}
}
दोनों दृष्टिकोणों के पास उनके संबंधित गुण हैं। clone
अच्छा है क्योंकि इसकी एक विधि है, इसलिए आपको सटीक प्रकार को जानने की आवश्यकता नहीं है। अंत में, आपको हमेशा "परिपूर्ण" प्रतिलिपि के साथ समाप्त होना चाहिए। कॉपी कन्स्ट्रक्टर अच्छा है क्योंकि कॉलर को निर्णय लेने का मौका है, जैसा कि जावा कलेक्शन द्वारा देखा जा सकता है।
final List c = ...
// Got c from somewhere else, could be anything.
// Maybe too slow for what we're trying to do?
final List myC = new ArrayList(c);
// myC is an ArrayList, with known properties
मैं या तो दृष्टिकोण चुनने की सलाह देता हूं, जो भी आपको बेहतर लगेगा।
मैं केवल यूनिट परीक्षणों में प्रतिबिंबित प्रतिलिपि या तत्काल धारावाहिक/deserializing जैसे अन्य दृष्टिकोणों का उपयोग करता हूं। मेरे लिए, वे मुख्य रूप से प्रदर्शन चिंताओं के कारण, उत्पादन कोड के लिए कम उपयुक्त महसूस करते हैं।
पर समर्थित है है इस परीक्षण उद्देश्य केवल (इकाई-परीक्षण) के लिए, या क्या आपको वास्तविक उत्पादन कोड में इस कार्यक्षमता की आवश्यकता है? – crunchdog