आप तीन में से एक विकल्प हैं:
IAnimal
पर एक विधि गहरा वस्तु क्लोन करने के लिए है (द्वारा प्रयोग किया जाता Node.cloneNode(boolean)
जैसे डीओएम इंटरफेस जैसे पुस्तकालय)
IAnimal
के सभी कार्यान्वयन में एक कॉपी कन्स्ट्रक्टर बनाएं जो ठोस प्रकार लेता है और उसे एक आवश्यकता बना देता है इंटरफ़ेस अनुबंध में एनटी, फिर इसे
- प्रत्येक प्रति कार्यान्वयन की प्रतिलिपि बनाने के लिए प्रतिबिंब का उपयोग करें
- एक तृतीय-पक्ष लाइब्रेरी का उपयोग करें जो आपके अनुबंधों के साथ गहरे क्लोनिंग को लागू करता है, जैसे नो-Args रचनाकार, गैर-अंतिम फ़ील्ड,
Serializable
कक्षाएं, इत्यादि।, सूचीबद्ध here
कॉपी विधि
# 1 के लिए प्रश्न, जैसे कर कुछ की तरह:
public interface IAnimal {
IAnimal cloneDeep();
}
लागू है कि आपके ठोस प्रकार में, तो उस विधि आह्वान इसे कॉपी:
this.pet = pet.cloneDeep();
फिर इंटरफ़ेस में आवश्यकता को दस्तावेज़ करें, कह रहा है की तर्ज पर omething:
इस इंटरफेस एक वस्तु है कि इस उदाहरण के लिए नहीं ==
है, और गहराई से क्लोन किया जाना चाहिए ताकि इस वस्तु की कि हेरफेर लौटे एक के हेरफेर करने के लिए नेतृत्व नहीं करता है लौटना चाहिए की क्रियान्वयन और इसके विपरीत।
इंटरफ़ेस के अनुरूप होने के लिए कार्यान्वयन को इस अनुबंध का पालन करना होगा, लेकिन यह संकलन समय पर लागू नहीं किया जाएगा। संजीदगी से एक प्रतिलिपि निर्माता का उपयोग करने के
कॉपी निर्माता
प्रयास करें, तो राज्य है कि एक प्रति निर्माता इंटरफ़ेस है, जो इंटरफेस अनुबंध का हिस्सा बन जाता में सभी ठोस कार्यान्वयन में आवश्यक है। प्रत्येक कार्यान्वयन तो इस प्रकार दिखाई देगा:
public class Dog implements IAnimal {
private String name;
public Dog(Dog dog) {
this.name = dog.name;
}
}
और फिर आप सभी की जरूरत हर कार्यान्वयन प्रतिलिपि बनाने में एकल विधि है:
public static <A extends IAnimal> A copy(A animal) {
Class<?> animalType = animal.getClass();
// This next line throws a number of checked exceptions you need to catch
return (A) animalType.getConstructor(animalType).newInstance(animal);
}
एक तो आप इस किया है, अपने इंटरफेस के दशक में इस आशय का एक बयान जोड़ने प्रलेखन:
इस इंटरफेस
की
क्रियान्वयन एक प्रति निर्माता है कि एक ही प्रकार या उनके वर्ग के महाप्रकार का एक तर्क लेता है परिभाषित करना होगा। इस कन्स्ट्रक्टर को तर्क की एक गहरी प्रतिलिपि बनाना चाहिए ताकि इस वस्तु के हेरफेर से लौटाए गए व्यक्ति के हेरफेर और इसके विपरीत नहीं हो सके।
फिर, यह रनटाइम लागू है। copy
उपरोक्त विधि NoSuchMethodException
त्रुटियों को फेंकता है जब निर्माता मौजूद नहीं है।
कॉपी फैक्टरी
यह IAnimal
लेता है और instanceof
का उपयोग करता है तय करने के लिए कौन सी विधि, करने के लिए इसे पारित करने के लिए की तरह:
public static IAnimal copyAnimal(IAnimal animal) {
if (animal instanceof Dog)
return copyDog((Dog) animal);
if (animal instanceof Cat)
return copyCat((Cat) animal);
//...
else
throw new IllegalArgumentException("Could not copy animal of type: "
+ animal.getClass().getName());
}
तो प्रत्येक प्रकार के लिए copy
तरीकों में गहरी नकल कर मैन्युअल रूप से ।
यदि आप एक गहरी प्रतिलिपि चाहते हैं तो आपको पशु में एक प्रति-निर्माता भी लागू करना चाहिए। – alfasin
आप पशु में एक कॉपी-कन्स्ट्रक्टर को बस कार्यान्वित नहीं कर सकते हैं। इस मामले में आपके पास एक इंटरफ़ेस IAimal है। इसलिए आपको यह जानने की आवश्यकता होगी कि आपको किस ठोस वर्ग को तत्काल करने की आवश्यकता है। – Mene