ক্লোন পদ্ধতি এবং ক্লোনযোগ্য ইন্টারফেস - 1

"হাই, অ্যামিগো!"

"হাই কিম."

"আমি আপনাকে ক্লোন() পদ্ধতি সম্পর্কে বলতে যাচ্ছি।"

"এই পদ্ধতির বিন্দু হল একটি বস্তুর ক্লোন করা, বা অন্য কথায়, বস্তুর একটি ক্লোন/কপি/ডুপ্লিকেট তৈরি করা।"

"যখন এই পদ্ধতিটি বলা হয়, তখন জাভা ভার্চুয়াল মেশিন তৈরি করে এবং এটিকে কল করা বস্তুর একটি ডুপ্লিকেট ফেরত দেয়৷

অবজেক্ট ক্লাসের ক্লোন পদ্ধতির বাস্তবায়ন খুবই আদিম: শুধুমাত্র একটি নতুন অবজেক্ট তৈরি করা হয়, এবং আসল অবজেক্টের ক্ষেত্রগুলির মানগুলি তার ক্ষেত্রগুলিতে বরাদ্দ করা হয়।

যদি অনুলিপি করা বস্তুতে অন্যান্য বস্তুর উল্লেখ থাকে, তাহলে সেই রেফারেন্সগুলি অনুলিপি করা হবে। এই বস্তুর সদৃশ তৈরি করা হবে না।"

"হুম। আর বেশি কিছু করতে হবে না।"

"বিষয়টি হল, জাভা ভার্চুয়াল মেশিন জানে না কোন বস্তুগুলিকে ক্লোন করা যায় বা করা যায় না। উদাহরণস্বরূপ, ফাইলগুলি ক্লোন করা যায় না। একটি System.in স্ট্রিমের ক্ষেত্রেও একই কথা সত্য।"

"সুতরাং, পূর্ণাঙ্গ ক্লোনিংয়ের প্রশ্নটি একটি শ্রেণীর বিকাশকারীদের কাছে দেওয়া হয়েছিল৷ "এটি কীভাবে সমান পদ্ধতি পরিচালনা করা হয় তার মতোই৷ হ্যাশকোডের সাথে তুলনীয় কিছু আছে: ক্লোনযোগ্য ইন্টারফেস।"

" ক্লোনযোগ্য ইন্টারফেসকে 'মার্কার ইন্টারফেস' বলা হয়: এটির কোনো পদ্ধতি নেই এবং নির্দিষ্ট শ্রেণী চিহ্নিত করতে ব্যবহৃত হয়।

"যদি কোনো ক্লাসের ডেভেলপার বিশ্বাস করে যে ক্লাসের অবজেক্ট ক্লোন করা যায়, সে এই ইন্টারফেস দিয়ে চিহ্নিত করে (অর্থাৎ ক্লাসটিকে ক্লোনযোগ্য করে তোলে)।"

"যদি বিকাশকারী ক্লোন পদ্ধতির আদর্শ বাস্তবায়ন পছন্দ না করে, তবে তাকে অবশ্যই নিজের লিখতে হবে যা সঠিক উপায়ে একটি সদৃশ বস্তু তৈরি করবে।"

"আপনি যখন ক্লোন () পদ্ধতিতে কল করেন, তখন জাভা চেক করে যে বস্তুটি ক্লোনযোগ্য ইন্টারফেস সমর্থন করে কিনা। যদি এটি করে, তাহলে এটি ক্লোন () পদ্ধতি ব্যবহার করে অবজেক্টটিকে ক্লোন করে ; যদি না হয়, এটি একটি CloneNotSupportedException নিক্ষেপ করে।"

"অন্য কথায়, আমাদের হয় ক্লোন পদ্ধতিকে ওভাররাইড করতে হবে বা ক্লাসটিকে ক্লোনযোগ্য করতে হবে?"

"হ্যাঁ, কিন্তু আপনাকে এখনও পদ্ধতিটি ওভাররাইড করতে হবে৷ ক্লোন() পদ্ধতিটিকে সুরক্ষিত হিসাবে ঘোষণা করা হয়েছে, তাই এটিকে কেবলমাত্র এর প্যাকেজের ক্লাসগুলি (java.lang) বা তাদের সাবক্লাসগুলিতে কল করা যেতে পারে।"

"আমি একটু বিভ্রান্ত-তাহলে একটি বস্তুর ক্লোন করার জন্য আমাকে কী করতে হবে?"

"আপনি যদি অবজেক্ট ক্লাসের «ডিফল্ট» ক্লোনিং পদ্ধতি ব্যবহার করতে চান তবে আপনাকে এটি করতে হবে:

" ক) আপনার ক্লাসে ক্লোনযোগ্য ইন্টারফেস যোগ করুন"

" খ) ক্লোন পদ্ধতি ওভাররাইড করুন এবং আপনার বাস্তবায়নের মধ্যে সুপারক্লাসের বাস্তবায়নকে কল করুন:"

class Point implements Cloneable
{
 int x;
 int y;

 public Object clone()
 {
  return super.clone();
 }
    }

"অথবা আপনি সম্পূর্ণরূপে আপনার নিজের উপর ক্লোন পদ্ধতির একটি বাস্তবায়ন লিখতে পারেন:"

class Point
{
 int x;
 int y;

 public Object clone()
 {
  Point point = new Point();
  point.x = this.x;
  point.y = this.y;
  return point;
 }
}

"এটি একটি আকর্ষণীয় পদ্ধতি। আমি নিশ্চিত যে আমি এটি ব্যবহার করব। মাঝে মাঝে..."