"কেন Cloneable
অবহেলা করা হয়নি?" এর সংক্ষিপ্ত উত্তর (বা প্রকৃতপক্ষে, কেন কারও জন্য X
অবহেলিত নয় X
) তা হ'ল এগুলি হ্রাস করার বিষয়ে খুব বেশি মনোযোগ দেওয়া হয়নি।
সম্প্রতি অপসারণ করা হয়েছে এমন বেশিরভাগ জিনিস হ্রাস করা হয়েছে কারণ সেগুলি সরানোর জন্য একটি নির্দিষ্ট পরিকল্পনা রয়েছে। উদাহরণস্বরূপ, addPropertyChangeListener
এবং removePropertyChangeListener
পদ্ধতি LogManager হয়েছে জাভা SE 8 অবচিত তাদের জাভা SE 9. মধ্যে সরানোর উদ্দেশ্যে (কারণ তারা অকারণে মডিউল * প্রতিষ্ঠানের জটিল।) বস্তুতপক্ষে, এই API গুলি ইতিমধ্যে করা হয়েছে গোড়ার দিকে JDK 9 থেকে সরানো গঠন তৈরী করে। (নোট করুন যে অনুরূপ সম্পত্তি পরিবর্তন শ্রোতাদের কলগুলিও এ থেকে সরানো হয়েছে Pack200
; দেখুন জেডিকে -8029806 )
এমন কোনো অনুরূপ পরিকল্পনা জন্য বিদ্যমান Cloneable
এবং Object.clone()
।
দীর্ঘতর উত্তরের মধ্যে আরও প্রশ্নগুলির সাথে আলোচনা করা জড়িত যেমন যেমন এই এপিআইগুলির ক্ষেত্রে কী ঘটতে পারে বলে আশা করা যায়, প্ল্যাটফর্মটিকে যদি অবমূল্যায়ন করা হয় তবে কী খরচ বা সুবিধা উপার্জন করতে পারে, এবং যখন কোনও এপিআই অবমূল্যায়ন করা হয় তখন ডেভেলপারদের কাছে কী যোগাযোগ করা হয়। আমি আমার সাম্প্রতিক জাভাওনের টক, tণ এবং অবমূল্যায়নে এই বিষয়টি ঘুরে দেখলাম । (স্লাইড যে লিঙ্ক এ উপলব্ধ; ভিডিওটি এখানে ।) এটা পরিনত হয় যে JDK নিজেই থামিয়ে দেওয়া তার ব্যবহার খুব সামঞ্জস্যপূর্ণ ছিল না। এটি বিভিন্ন ধরণের অর্থ বোঝাতে ব্যবহৃত হয়েছে, উদাহরণস্বরূপ,
এই বিপজ্জনক এবং আপনি এটি ব্যবহার ঝুঁকি সচেতন হতে হবে (উদাহরণ: Thread.stop()
, Thread.resume()
, এবং Thread.suspend()
)।
এটি ভবিষ্যতের প্রকাশে মুছে ফেলা হচ্ছে
এটি অপ্রচলিত এবং আলাদা কিছু ব্যবহার করা আপনার পক্ষে ভাল ধারণা (উদাহরণ: পদ্ধতিগুলির মধ্যে অনেকগুলি java.util.Date
)
এগুলির সমস্ত স্বতন্ত্র অর্থ, এবং এগুলির বিভিন্ন সাবসেটগুলি হ'ল মূল্যহীন বিভিন্ন জিনিসের ক্ষেত্রে প্রযোজ্য। এবং এগুলির কিছু উপসেটগুলি এমন জিনিসগুলিতে প্রযোজ্য যেগুলি অবহেলা করা হয়নি (তবে এটি সম্ভবত হ্রাস করা উচিত)।
Cloneable
এবং Object.clone()
"ভাঙ্গা" হয় ইন্দ্রিয় তারা নকশা সংক্রান্ত ত্রুটিগুলি আছে এবং সঠিকভাবে ব্যবহার করা কঠিন যে। তবে, clone()
অ্যারেগুলি অনুলিপি করার সর্বোত্তম উপায় এবং ক্লোনিংয়ের সাবধানতার সাথে বাস্তবায়িত ক্লাসগুলির উদাহরণগুলির অনুলিপি তৈরি করার কিছুটা সীমিত উপযোগিতা রয়েছে। ক্লোনিং অপসারণ করা একটি বেমানান পরিবর্তন হতে পারে যা অনেক কিছুই ভেঙে দেয়। একটি ক্লোনিং অপারেশন অন্যভাবে পুনরায় প্রয়োগ করা যেতে পারে তবে এটি সম্ভবত ধীর হবে Object.clone()
।
তবে, বেশিরভাগ জিনিসের জন্য একটি অনুলিপি নির্মাণকারী ক্লোনিংয়ের চেয়ে পছন্দসই। সুতরাং সম্ভবত Cloneable
"অপ্রচলিত" বা "সুপারসাইড" বা অনুরূপ কিছু চিহ্নিত করা উপযুক্ত হবে। এটি বিকাশকারীদের বলবে যে তারা সম্ভবত অন্য কোথাও দেখতে চান, তবে এটি ভবিষ্যতে প্রকাশের ক্ষেত্রে ক্লোনিং প্রক্রিয়াটি অপসারণের ইঙ্গিত দেয় না। দুর্ভাগ্যক্রমে, এরূপ কোনও চিহ্নিতকারী উপস্থিত নেই।
যেহেতু জিনিসগুলি দাঁড়িয়ে আছে, "অবমূল্যায়ন" হ'ল চূড়ান্ত অপসারণকে বোঝায় - যদিও অদৃশ্যভাবে অল্প সংখ্যক হ্রাসযোগ্য বৈশিষ্ট্য কখনও অপসারণ করা হয়েছে - এবং তাই ক্লোনিং ব্যবস্থার জন্য অবমূল্যায়নের অনুমোদন বলে মনে হয় না। সম্ভবত ভবিষ্যতে একটি বিকল্প চিহ্নিতকরণ প্রয়োগ করা যেতে পারে যা বিকাশকারীদের পরিবর্তে বিকল্প পদ্ধতি ব্যবহার করার নির্দেশ দেয়।
হালনাগাদ
আমি বাগ রিপোর্টে কিছু অতিরিক্ত ইতিহাস যুক্ত করেছি । প্রথম জেভিএম বাস্তবায়নকারী এবং জেভিএম স্পেসিফিকেশনের সহ-লেখক, ফ্র্যাঙ্ক ইয়েলিন অন্য উত্তরে উদ্ধৃত হওয়া টিআরসি সুপারিশে "সময়ের মিসস্টে হারিয়ে যাওয়া" মন্তব্যের জবাবে কিছু মন্তব্য করেছিলেন । আমি এখানে সম্পর্কিত অংশ উদ্ধৃত করেছি; সম্পূর্ণ বার্তাটি বাগ রিপোর্টে রয়েছে।
ক্রিয়ালিজেবলের একই কারণে ক্লোনেবেলের কোনও পদ্ধতি নেই। ক্লোনযোগ্য ক্লাসের একটি বৈশিষ্ট্য নির্দেশ করে, ক্লাসটি যে পদ্ধতিগুলি সমর্থন করেছিল সে সম্পর্কে নির্দিষ্টভাবে কিছু বলার অপেক্ষা রাখে না।
প্রতিবিম্বের আগে, আমাদের কোনও অবজেক্টের অগভীর অনুলিপি তৈরি করার জন্য একটি দেশীয় পদ্ধতি প্রয়োজন। সুতরাং অবজেক্ট.ক্লোন () জন্মগ্রহণ করেছিল। এটি আরও স্পষ্ট ছিল যে অনেক শ্রেণি এই পদ্ধতিটিকে ওভাররাইড করতে চাইবে এবং প্রতিটি শ্রেণি ক্লোন করতে চাইবে না। সুতরাং প্রোগ্রামারটির অভিপ্রায়টি নির্দেশ করতে ক্লোনেবেলের জন্ম হয়েছিল।
সংক্ষেপে, ক্লোনিয়েবলের উদ্দেশ্যটি এটি নির্দেশ করে না যে আপনার একটি সার্বজনীন ক্লোন () পদ্ধতি ছিল। এটি বোঝানো হয়েছিল যে আপনি অবজেক্ট.ক্লোন () ব্যবহার করে ক্লোন করতে ইচ্ছুক ছিলেন এবং ক্লোন () কে পাবলিক করবেন কি করবেন না তা সিদ্ধান্ত গ্রহণের উপর নির্ভর করে।