ক্লোনিং একটি প্রাথমিক প্রোগ্রামিং দৃষ্টান্ত। জাভা বিভিন্নভাবে এটি খারাপভাবে প্রয়োগ করেছে এই সত্যটি ক্লোনিংয়ের প্রয়োজনীয়তা একেবারেই হ্রাস করে না। এবং, ক্লোনিং কার্যকর করা সহজ যা আপনি কাজ করতে চান, অগভীর, গভীর, মিশ্রিত যাই হোক না কেন এটি কার্যকর হবে। আপনি এমনকি ফাংশনটির জন্য নাম ক্লোন ব্যবহার করতে পারেন এবং পছন্দ করতে চাইলে ক্লোননেবল প্রয়োগ করতে পারবেন না।
ধরুন আমার কাছে A, B, এবং C ক্লাস রয়েছে, যেখানে B এবং C এ থেকে উদ্ভূত হয়েছে, যদি আমার কাছে এ জাতীয় টাইপের বস্তুর একটি তালিকা থাকে:
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):
}
আমি ক্লোনেবেল বাস্তবায়ন করছি না, কেবল একই ফাংশনটির নাম ব্যবহার করে। যদি আপনি এটি পছন্দ না করেন তবে এটির নাম দিন।