क्लोनिंग एक बुनियादी प्रोग्रामिंग प्रतिमान है। तथ्य यह है कि जावा ने इसे कई तरीकों से खराब तरीके से कार्यान्वित किया है, यह क्लोनिंग की आवश्यकता को कम नहीं करता है। और, क्लोनिंग को कार्यान्वित करना आसान है जो काम करेगा हालांकि आप इसे काम करना, उथले, गहरे, मिश्रित, जो कुछ भी करना चाहते हैं। आप फ़ंक्शन के लिए क्लोन नाम का भी उपयोग कर सकते हैं और यदि आप चाहें तो क्लोनेबल लागू नहीं कर सकते हैं।
मान लीजिए मैं वर्गों ए, बी, और सी, जहां बी और सी ए से प्राप्त कर रहे हैं मैं एक इस तरह ग्रुप ए की वस्तुओं की सूची है है
ArrayList<A> list1;
अब, उस सूची कर सकते हैं ए, बी, या सी प्रकार की वस्तुएं आप नहीं जानते कि वस्तुएं किस प्रकार हैं। तो, अगर आप इस तरह की सूची की प्रतिलिपि नहीं कर सकते हैं:
ArrayList<A> list2 = new ArrayList<A>();
for(A a : list1) {
list2.add(new A(a));
}
तो ऑब्जेक्ट प्रकार बी या सी का वास्तव में है, तो आप सही प्रतिलिपि प्राप्त नहीं होंगे। और, क्या होगा अगर ए सार है? अब, कुछ लोगों ने यह सुझाव दिया है:
ArrayList<A> list2 = new ArrayList<A>();
for(A a : list1) {
if(a instanceof A) {
list2.add(new A(a));
} else if(a instanceof B) {
list2.add(new B(a));
} else if(a instanceof C) {
list2.add(new C(a));
}
}
यह एक बहुत ही बुरा विचार है। क्या होगा यदि आप एक नया व्युत्पन्न प्रकार जोड़ते हैं? क्या होगा यदि बी या सी दूसरे पैकेज में हैं और आपके पास इस कक्षा में उनकी पहुंच नहीं है?
इस आप क्या करना चाहते हैं:
ArrayList<A> list2 = new ArrayList<A>();
for(A a : list1) {
list2.add(a.clone());
}
बहुत से लोग यह संकेत दिया है कि क्यों क्लोन के बुनियादी जावा कार्यान्वयन समस्याग्रस्त है।
वर्ग एक में:
public A clone() {
return new A(this);
}
वर्ग बी में:
@Override
public B clone() {
return new B(this);
}
वर्ग सी में:
@Override
public C clone() {
return new C(this):
}
कार्यान्वयन के लिए मैं नहीं कर रहा हूँ लेकिन, यह आसानी से इस तरह से काबू पाने के है क्लोनेबल, बस एक ही फ़ंक्शन नाम का उपयोग करना। यदि आपको यह पसंद नहीं है, तो इसे और कुछ नाम दें।
क्या तुलना में फायदे और नुकसान? – Galactus
मैंने पढ़ा कि क्लोनबल बनाम नहीं होने वाले वर्ग के लाभ का मतलब है। सुनिश्चित नहीं है कि इसका अर्थ कैसे और समझा जा सकता है: एस – allyourcode