clone()
সুরক্ষিত হিসাবে সংজ্ঞায়িত করা নির্দিষ্ট কারণটি কী java.lang.Object
?
clone()
সুরক্ষিত হিসাবে সংজ্ঞায়িত করা নির্দিষ্ট কারণটি কী java.lang.Object
?
উত্তর:
ক্লোনটি সুরক্ষিত তা সত্যই সন্দেহজনক - যেমনটি ইন্টারফেসে clone
পদ্ধতিটি ঘোষিত হয়নি Cloneable
।
এটি ডেটা অনুলিপি গ্রহণের জন্য পদ্ধতিটিকে অত্যন্ত অকেজো করে তোলে কারণ আপনি বলতে পারবেন না :
if(a instanceof Cloneable) {
copy = ((Cloneable) a).clone();
}
আমি মনে করি যে নকশাকে Cloneable
এখন মূলত একটি ভুল হিসাবে ধরা হয় (নীচে উদ্ধৃত করা)। আমি সাধারণত একটি ইন্টারফেসের প্রয়োগগুলি করতে সক্ষম হতে চাই Cloneable
তবে প্রয়োজনীয়ভাবে ইন্টারফেসটিCloneable
(ব্যবহারের অনুরূপ নয় Serializable
) করতে পারি না। প্রতিবিম্ব ছাড়া এটি করা যাবে না:
ISomething i = ...
if (i instanceof Cloneable) {
//DAMN! I Need to know about ISomethingImpl! Unless...
copy = (ISomething) i.getClass().getMethod("clone").invoke(i);
}
জোশ ব্লচের কার্যকর জাভা থেকে উদ্ধৃতি :
"ক্লোনযোগ্য ইন্টারফেসটি মিশ্রণ ইন্টারফেস হিসাবে বস্তুগুলির জন্য যাতে তারা ক্লোনিংয়ের অনুমতি দেয় তা উদ্দেশ্য করে তৈরি করা হয়েছিল Unfortunately দুর্ভাগ্যক্রমে এটি এই উদ্দেশ্যটি কার্যকর করতে ব্যর্থ হয়েছে ... এটি ইন্টারফেসের একটি অতি aticalical ব্যবহার এবং একটি অনুকরণ করা হয় না ... ইন্টারফেসটি কোনও শ্রেণীর উপর প্রভাব ফেলতে কার্যকর করার জন্য এটি এবং এর সমস্ত সুপারক্লাসকে অবশ্যই একটি জটিল, অদৃশ্যযোগ্য এবং বৃহত্তরভাবে অননুমোদিত প্রোটোকল মানতে হবে "
Serializable
- এটি বাস্তবায়ন করা হবে কিনা তা সিদ্ধান্ত নিতে বাস্তবায়নের আপ হয় Serializable
। আমি এটিকে প্রসারিত করছিলাম Cloneable
- এটি এমন কোনও বিষয় নয় যা কোনও ইন্টারফেসকে প্রসারিত করা উচিত - তবে একটি ইন্টারফেসের বাস্তবায়ন বিনামূল্যে Cloneable
। সমস্যাটি হ'ল, যদি আপনার ইন্টারফেসের ধরণের পরামিতি থাকে তবে আপনি এটি জিজ্ঞাসা করতে চান এটি ক্লোনযোগ্য কিনা; তবে আপনি আসলে এটি ক্লোন করতে পারবেন না!
ক্লোনেবেল ইন্টারফেসটি এমন এক চিহ্ন মাত্র যা ক্লাস ক্লোন সমর্থন করতে পারে support পদ্ধতিটি সুরক্ষিত কারণ আপনার এটিকে অবজেক্টে কল করা উচিত নয়, আপনি এটিকে সর্বজনীন হিসাবে ওভাররাইড করতে পারেন should
সূর্য থেকে:
ক্লাস অবজেক্টে, ক্লোন () পদ্ধতিটি সুরক্ষিত হিসাবে ঘোষণা করা হয়। যদি আপনি সমস্ত কিছু ক্লোনিয়েবল বাস্তবায়ন করে থাকেন তবে কেবলমাত্র সাবক্লাস এবং একই প্যাকেজের সদস্যগণ বস্তুটিতে ক্লোন () কল করতে সক্ষম হবেন। ক্লোন () পদ্ধতিটি অ্যাক্সেস করতে যে কোনও প্যাকেজে কোনও শ্রেণিকে সক্ষম করতে, আপনাকে এটিকে ওভাররাইড করে নীচের মত প্রকাশ্যে ঘোষণা করতে হবে। (আপনি যখন কোনও পদ্ধতিকে ওভাররাইড করবেন তখন আপনি এটিকে কম ব্যক্তিগত, তবে বেশি ব্যক্তিগত রাখতে পারবেন না Here
Set
clone
সুরক্ষিত কারণ এটি এমন একটি বিষয় যা ওভাররাইড করা উচিত যাতে এটি বর্তমান শ্রেণীর সাথে নির্দিষ্ট। যদিও এটি এমন কোনও পাবলিক clone
পদ্ধতি তৈরি করা সম্ভব হবে যা এই যে কোনও বিষয়কে ক্লোন করবে এমন শ্রেণীর জন্য বিশেষত লিখিত পদ্ধতি হিসাবে ভাল হবে না।
ক্লোন পদ্ধতিটি কোনও বস্তুর উপরে সরাসরি ব্যবহার করা যায় না, এজন্যই এটি সাবক্লাস দ্বারা ওভাররাইড করার উদ্দেশ্যে is
অবশ্যই এটি সর্বজনীন হতে পারে এবং ক্লোনিং করা সম্ভব না হলে কেবল একটি উপযুক্ত ব্যতিক্রম ছুঁড়ে ফেলা যায় তবে আমি মনে করি এটি বিভ্রান্তিকর হবে।
ক্লোনটি এখনই প্রয়োগ করার উপায় আপনাকে কীভাবে ক্লোন ব্যবহার করতে চান এবং কীভাবে আপনার অবজেক্টটিকে ক্লোন করতে চান তা আপনাকে ভাবিয়ে তোলে।
এটা তোলে সুরক্ষিত কারণ ডিফল্ট বাস্তবায়ন (ব্যক্তিগত সহ) সব ক্ষেত্র একটি অগভীর memberwise কপি করে, হয় কন্সট্রাকটর circumventing । এটি এমন কোনও জিনিস নয় যা কোনও বস্তু প্রথম স্থানে হ্যান্ডেল করার জন্য ডিজাইন করা হতে পারে (উদাহরণস্বরূপ, এটি তৈরি করা অবজেক্টের উদাহরণগুলি একটি ভাগ করা তালিকায় রাখতে পারে, বা অনুরূপ কিছু)।
একই কারণে, ডিফল্ট বাস্তবায়নটি clone()
ছুঁড়ে ফেলা হবে যদি এটির উপরে কল করা বস্তুটি কার্যকর না করে Cloneable
। এটি সুদূরপ্রসারী পরিণতি সহ একটি সম্ভাব্য অনিরাপদ অপারেশন, এবং সুতরাং শ্রেণীর লেখককে অবশ্যই স্পষ্টভাবে নির্বাচন করতে হবে।
ক্লোনযোগ্য জাভাদোক থেকে।
* By convention, classes that implement this interface (cloneable) should override
* <tt>Object.clone</tt> (which is protected) with a public method.
* See {@link java.lang.Object#clone()} for details on overriding this
* method.
* Note that this interface does <i>not</i> contain the <tt>clone</tt> method.
* Therefore, it is not possible to clone an object merely by virtue of the
* fact that it implements this interface. Even if the clone method is invoked
* reflectively, there is no guarantee that it will succeed.
সুতরাং আপনি প্রতিটি বস্তুর উপর ক্লোন কল করতে পারেন তবে এটি আপনাকে বেশিরভাগ সময় দেয় যা আপনি চান ফলাফল বা ব্যতিক্রম নয়। তবে আপনি যদি ক্লোনযোগ্য প্রয়োগ করেন তবেই উত্সাহিত হবে।
আইএমএইচও এটি এত সহজ:
#clone
অ-ক্লোনযোগ্য বস্তুগুলিতে অবশ্যই কল করা উচিত নয়, সুতরাং এটি সর্বজনীন করা হয় না#clone
Object
সঠিক শ্রেণীর অগভীর অনুলিপি পেতে ক্লোনেবেল বাস্তবায়নকারী সাবক্লাস ওবকে ডাকতে হবেউপশ্রেণীর দ্বারা কলযোগ্য, তবে অন্যান্য শ্রেণীর দ্বারা নয় এমন পদ্ধতির সঠিক সুযোগটি কী?
এটা protected
।
Cloneable
অবশ্যই প্রয়োগকারী ক্লাসগুলি এই পদ্ধতিটি সর্বজনীন করে তুলবে যাতে এটি অন্যান্য শ্রেণি থেকে কল করা যায়।
ক্লোন () পদ্ধতির অভ্যন্তরীণভাবে 'ক্লোনযোগ্য বা না'র উদাহরণ রয়েছে। যা জাভা টিমটি কীভাবে ক্লোন () মেথডক্লোন () পদ্ধতির অপ্রয়োজনীয় ব্যবহারকে সীমাবদ্ধ রাখবে বলে মনে করে তা কেবল সাবক্লাস দ্বারা অ্যাক্সেস করা। যেহেতু অবজেক্টটি সমস্ত সাব ক্লাসের প্যারেন্ট ক্লাস, সুতরাং ক্লোন () পদ্ধতিটি সমস্ত ক্লাস দ্বারা ব্যবহার করা যেতে পারে যদি আমাদের 'ক্লোনযোগ্য উদাহরণ' এর উপরের চেক না থাকে। এই কারণেই জাভা টিম ক্লোন () পদ্ধতিতে পরীক্ষা করে 'ক্লোনযোগ্য' এর উদাহরণ হিসাবে ক্লোন () ব্যবহারের ভুল ব্যবহার সীমাবদ্ধ করার কথা ভাবতে পারে।
অতএব ক্লোনীয় প্রয়োগ করা ক্লাসগুলি যাই হোক না কেন অবজেক্ট শ্রেণির ক্লোন () পদ্ধতি ব্যবহার করতে পারে।
এটি যেহেতু এটি সুরক্ষিত তৈরি হয়েছে, এটি ক্লোনযোগ্য ইন্টারফেস প্রয়োগকারী কেবলমাত্র সাব-ক্লাসের জন্য উপলব্ধ। আমরা যদি এটি সর্বজনীন করতে চাই, তবে এই পদ্ধতিটি উপ-শ্রেণীর দ্বারা এটি প্রয়োগ করার সাথে সাথে তাদের ওভাররাইড করতে হবে।
হ্যাঁ, আমি যে সমস্যার মুখোমুখি হয়েছিলাম। তবে আমি এই কোডটি প্রয়োগ করে এটি সমাধান করি
public class Side implements Cloneable {
public Side clone() {
Side side = null;
try {
side = (Side) super.clone();
} catch (CloneNotSupportedException e) {
System.err.println(e);
}
return side;
}
}
ঠিক যেমনটি আগে কেউ বলেছিল।
ঠিক আছে, সূর্যের বিকাশকারীরাও কেবল মানব, এবং তারা ক্লোন পদ্ধতিটি সুরক্ষিত হিসাবে বাস্তবায়নের জন্য বিশাল ভুল করেছিলেন, অ্যারেলিস্টে কোনও অ-কার্যকরী ক্লোন পদ্ধতি প্রয়োগ করার মতোই ভুলটি! সুতরাং, সাধারণভাবে, ক্লোন পদ্ধতি সম্পর্কে এমনকি অভিজ্ঞ জাভা প্রোগ্রামারদের সম্পর্কে আরও গভীর ভুল বোঝাবুঝি রয়েছে।
যাইহোক, আমি সম্প্রতি কোনও বিষয়বস্তু দিয়ে এটির কীভাবে নির্মিত এবং এটি কী আছে তা নির্ধারণের জন্য একটি দ্রুত এবং সহজ সমাধান খুঁজে পেয়েছি, আমার উত্তরটি এখানে দেখুন: অবজেক্ট.ক্লোন () ব্যবহার করে বাগ করুন
আবার জাভা জেডিকে কাঠামো উজ্জ্বল চিন্তাভাবনা দেখায়:
ক্লোনযোগ্য ইন্টারফেসে "পাবলিক টি ক্লোন () থাকে না; পদ্ধতি কারণ এটি আরও বেশি বৈশিষ্ট্যের মতো কাজ করে (উদা। সিরিয়ালাইজেবল) যা এটি একটি উদাহরণকে ক্লোন করার অনুমতি দেয়।
এই নকশায় কোনও ভুল নেই কারণ:
অবজেক্ট.ক্লোন () আপনার কাস্টম-সংজ্ঞায়িত শ্রেণীর সাথে আপনি যা চান তা করবে না।
আপনার যদি মাইক্লাস ক্লোনযোগ্য => প্রয়োগ করে থাকে তবে আপনি "পাবলিক মাইক্লাস ক্লোন ()" দিয়ে ক্লোনটি ওভাররাইট করুন
আপনার যদি মাইনইনফেরফেস ক্লোনযোগ্য এবং কিছু মাই ক্লাসগুলি মাইইন্টারফেস বাস্তবায়িত করে: কেবলমাত্র "পাবলিক মাই ইন্টারফেস ক্লোন () সংজ্ঞায়িত করুন;" ইন্টারফেসে এবং মাইআইন্টারফেস অবজেক্টগুলি ব্যবহার করে প্রতিটি পদ্ধতিতে তাদের ক্লোন করতে সক্ষম হবে, তাদের মাইক্লাস-শ্রেণি যাই হোক না কেন।