ক্লোন () পদ্ধতিটি জাভা.লং.অবজেক্টে সুরক্ষিত কেন?


উত্তর:


107

ক্লোনটি সুরক্ষিত তা সত্যই সন্দেহজনক - যেমনটি ইন্টারফেসে 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 ব্যবহার এবং একটি অনুকরণ করা হয় না ... ইন্টারফেসটি কোনও শ্রেণীর উপর প্রভাব ফেলতে কার্যকর করার জন্য এটি এবং এর সমস্ত সুপারক্লাসকে অবশ্যই একটি জটিল, অদৃশ্যযোগ্য এবং বৃহত্তরভাবে অননুমোদিত প্রোটোকল মানতে হবে "


2
যদি অবজেক্টটি ক্লোনযোগ্য নয়, তবে অবজেক্টের ক্লোন () ক্লোননটসপটেডএক্সসেপশন নিক্ষেপ করবে। সুতরাং আপনি যদি সুপারক্লোন () অবজেক্ট.ক্লোনকে () ডাকা হচ্ছে) কল করতে চলেছেন তবে আপনার ক্লোনযোগ্য হতে হবে। সিরিয়ালাইজেবল বাস্তবায়ন না করে কোনও জিনিস কীভাবে সিরিয়ালাইজ করা যায় তা আমি দেখছি না।
স্টিভ কুও

1
"আমি মনে করি যে ক্লোনেবেলের নকশা এখন অনেকাংশে একটি ভুল হিসাবে গণ্য" " [উদ্ধৃতি আবশ্যক]
কেভিন প্যাঙ্কো

দুঃখিত - আমি এটি বোঝাতে চাইছিলাম না। আমি নিছক implying ছিল "ভালো" নকশা যে না একটি ইন্টারফেস প্রসারিত করতে Serializable- এটি বাস্তবায়ন করা হবে কিনা তা সিদ্ধান্ত নিতে বাস্তবায়নের আপ হয় Serializable। আমি এটিকে প্রসারিত করছিলাম Cloneable- এটি এমন কোনও বিষয় নয় যা কোনও ইন্টারফেসকে প্রসারিত করা উচিত - তবে একটি ইন্টারফেসের বাস্তবায়ন বিনামূল্যে Cloneable। সমস্যাটি হ'ল, যদি আপনার ইন্টারফেসের ধরণের পরামিতি থাকে তবে আপনি এটি জিজ্ঞাসা করতে চান এটি ক্লোনযোগ্য কিনা; তবে আপনি আসলে এটি ক্লোন করতে পারবেন না!
অক্সবো_লাক্স

6
@ কেভিন - জোশ ব্লচের কার্যকর জাভা পিপি 45। "ক্লোনযোগ্য ইন্টারফেসটির উদ্দেশ্য ছিল যে তারা ক্লোনিংয়ের অনুমতি দেওয়ার জন্য বস্তুর জন্য মিক্সিন ইন্টারফেস হিসাবে তৈরি হয়েছিল। দুর্ভাগ্যক্রমে এটি এই উদ্দেশ্যে কাজ করতে ব্যর্থ হয়েছে"
অক্সবো_লাক

একই পৃষ্ঠায়: "এটি ইন্টারফেসের একটি অত্যন্ত কৌতুকপূর্ণ ব্যবহার এবং একটি অনুকরণযোগ্য নয়" এবং "ইন্টারফেসটি কোনও শ্রেণীর উপর কোনও প্রভাব ফেলতে কার্যকর করার জন্য এটি এবং এর সমস্ত সুপারক্লাসগুলি অবশ্যই মোটামুটি জটিল মেনে চলতে হবে ,
অদৃশ্যযোগ্য

30

ক্লোনেবেল ইন্টারফেসটি এমন এক চিহ্ন মাত্র যা ক্লাস ক্লোন সমর্থন করতে পারে support পদ্ধতিটি সুরক্ষিত কারণ আপনার এটিকে অবজেক্টে কল করা উচিত নয়, আপনি এটিকে সর্বজনীন হিসাবে ওভাররাইড করতে পারেন should

সূর্য থেকে:

ক্লাস অবজেক্টে, ক্লোন () পদ্ধতিটি সুরক্ষিত হিসাবে ঘোষণা করা হয়। যদি আপনি সমস্ত কিছু ক্লোনিয়েবল বাস্তবায়ন করে থাকেন তবে কেবলমাত্র সাবক্লাস এবং একই প্যাকেজের সদস্যগণ বস্তুটিতে ক্লোন () কল করতে সক্ষম হবেন। ক্লোন () পদ্ধতিটি অ্যাক্সেস করতে যে কোনও প্যাকেজে কোনও শ্রেণিকে সক্ষম করতে, আপনাকে এটিকে ওভাররাইড করে নীচের মত প্রকাশ্যে ঘোষণা করতে হবে। (আপনি যখন কোনও পদ্ধতিকে ওভাররাইড করবেন তখন আপনি এটিকে কম ব্যক্তিগত, তবে বেশি ব্যক্তিগত রাখতে পারবেন না Here


যা ঠিক আছে, যতক্ষণ না আপনি মিশ্রণে ইন্টারফেস নিয়ে আসেন - অজানা বাস্তবায়নটি ক্লোন করার চেষ্টা করুন এবং চেষ্টা করুনSet
অক্সবো_লাক

@ অক্সবো_লাক্স: তবে সেটের কিছু বাস্তবায়ন ক্লোনযোগ্য নয়
নিউএ্যাক্যাক্ট

3
আপনি ক্লোনযোগ্য ইন্টারফেস বাস্তবায়িত করে না এমন কোনও কিছু ক্লোন করতে পারবেন না - এটি এমন একটি মার্কার যা বলে যে "এই শ্রেণিটি সঠিকভাবে ক্লোনযোগ্য" - সিরিয়ালাইজেবল ইন্টারফেসের সাথে খুব মিল similar যাইহোক, সিরিয়ালাইজেশনের মাধ্যমে ক্লাস ক্লোন করার একটি উপায় রয়েছে যা ভালভাবে কাজ করে - গুগল "জাভা সিরিয়ালাইজেশন ক্লোন" এর মতো কিছু এবং সম্ভবত আপনি আপনার অবজেক্টের গভীর অনুলিপি পেতে বেশ কয়েকটি উপায় খুঁজে পাবেন।
বিল কে

4
আপনি ক্লোনযোগ্য ইন্টারফেস বাস্তবায়ন করে না এমন কোনও কিছু ক্লোন করতে পারবেন না, তবে কিছু ক্লোনযোগ্য ইন্টারফেস প্রয়োগ করে বলে আপনি এটি ক্লোন করতে পারবেন না।
মাইকেল ময়র্স

1
@ বাকেরি টু স্ট্রিংয়ের একটি ডিফল্ট বাস্তবায়ন রয়েছে, আপনি যদি এটির কল করেন তবে ভাল কিছু ঘটবে এবং আপনি একটি স্ট্রিং ফিরে পাবেন। সমানদের একটি ডিফল্ট বাস্তবায়ন হয় (== এর সমান)। ক্লোনটির একটি ডিফল্ট বাস্তবায়ন থাকতে পারে না। আপনি যদি এমন কোনও বস্তুর ক্লোন কল করেন যা এটি প্রয়োগ করে না, আপনি যুক্তিসঙ্গত আচরণ পাবেন না। ক্লোনিং জটিল এবং সত্যই স্বয়ংক্রিয়ভাবে সম্পন্ন করা যায় না (ডিফল্ট নির্মাতারা ব্যতীত কিছু বস্তু সাধারণভাবে ক্লোন করা অসম্ভব হতে পারে), তাই ডিফল্টরূপে তারা এটিকে কিছুটা নিরাপদ করে তোলে। আমি মনে করি এটি একেবারে অবজেক্টে রাখা, তবে, সম্ভবত এটির প্রয়োজন ছিল না।
বিল কে

7

cloneসুরক্ষিত কারণ এটি এমন একটি বিষয় যা ওভাররাইড করা উচিত যাতে এটি বর্তমান শ্রেণীর সাথে নির্দিষ্ট। যদিও এটি এমন কোনও পাবলিক cloneপদ্ধতি তৈরি করা সম্ভব হবে যা এই যে কোনও বিষয়কে ক্লোন করবে এমন শ্রেণীর জন্য বিশেষত লিখিত পদ্ধতি হিসাবে ভাল হবে না।


তবে কেন এটির জন্য সুরক্ষিত রাখা হয়েছে?
জানুস

3
এটি সুরক্ষিত যাতে আপনি অবজেক্টটিতে এটি ব্যবহার না করেন (এটি যাইহোক কেবল একটি ব্যতিক্রম ছুঁড়ে ফেলবে)। তারা চায় যে আপনি এটিকে কোনও শ্রেণিতে ওভাররাইড করুন, তারপরে আপনি এটিকে সর্বজনীন করুন। (নীচে কয়েকবার উত্তরও
বিল কে

1
নীচের আমার পয়েন্ট অনুসারে ইন্টারফেস বিবেচনা করার সময় অকেজো
অক্সবো_লাক

ওভাররাইড করা উচিত খুব স্পষ্ট নয় তবে এটি বিমূর্ত হওয়া উচিত ছিল এবং তারপরে অবজেক্ট ক্লাসে থাকা উচিত নয়, আমি কেন এটি এমন তা বুঝতে চেষ্টা করছি।
কুমার অভিষেক

4

ক্লোন পদ্ধতিটি কোনও বস্তুর উপরে সরাসরি ব্যবহার করা যায় না, এজন্যই এটি সাবক্লাস দ্বারা ওভাররাইড করার উদ্দেশ্যে is

অবশ্যই এটি সর্বজনীন হতে পারে এবং ক্লোনিং করা সম্ভব না হলে কেবল একটি উপযুক্ত ব্যতিক্রম ছুঁড়ে ফেলা যায় তবে আমি মনে করি এটি বিভ্রান্তিকর হবে।

ক্লোনটি এখনই প্রয়োগ করার উপায় আপনাকে কীভাবে ক্লোন ব্যবহার করতে চান এবং কীভাবে আপনার অবজেক্টটিকে ক্লোন করতে চান তা আপনাকে ভাবিয়ে তোলে।


2

এটা তোলে সুরক্ষিত কারণ ডিফল্ট বাস্তবায়ন (ব্যক্তিগত সহ) সব ক্ষেত্র একটি অগভীর memberwise কপি করে, হয় কন্সট্রাকটর circumventing । এটি এমন কোনও জিনিস নয় যা কোনও বস্তু প্রথম স্থানে হ্যান্ডেল করার জন্য ডিজাইন করা হতে পারে (উদাহরণস্বরূপ, এটি তৈরি করা অবজেক্টের উদাহরণগুলি একটি ভাগ করা তালিকায় রাখতে পারে, বা অনুরূপ কিছু)।

একই কারণে, ডিফল্ট বাস্তবায়নটি clone()ছুঁড়ে ফেলা হবে যদি এটির উপরে কল করা বস্তুটি কার্যকর না করে Cloneable। এটি সুদূরপ্রসারী পরিণতি সহ একটি সম্ভাব্য অনিরাপদ অপারেশন, এবং সুতরাং শ্রেণীর লেখককে অবশ্যই স্পষ্টভাবে নির্বাচন করতে হবে।


আসলে ডিফল্ট বাস্তবায়ন (বস্তুতে) ডক্স অনুসারে একটি ব্যতিক্রম ছুঁড়ে ফেলে ...
বিল কে

2
না, এটি কেবল ছুঁড়ে না। এর জাভাডোক থেকে: "ক্লাস অবজেক্টের জন্য পদ্ধতি ক্লোনটি একটি নির্দিষ্ট ক্লোনিং ক্রিয়াকলাপ সম্পাদন করে First অন্যথায়, এই পদ্ধতিটি এই বস্তুর শ্রেণীর একটি নতুন উদাহরণ তৈরি করে এবং তার সমস্ত ক্ষেত্রকে এই বস্তুর যথাযথ ক্ষেত্রগুলির সামগ্রীর সাথে সূচনা করে, যেমন বরাদ্দ দ্বারা; ক্ষেত্রের বিষয়বস্তু নিজেই ক্লোন হয় না। "
পাভেল মিনায়েভ

2

ক্লোনযোগ্য জাভাদোক থেকে।

* 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.

সুতরাং আপনি প্রতিটি বস্তুর উপর ক্লোন কল করতে পারেন তবে এটি আপনাকে বেশিরভাগ সময় দেয় যা আপনি চান ফলাফল বা ব্যতিক্রম নয়। তবে আপনি যদি ক্লোনযোগ্য প্রয়োগ করেন তবেই উত্সাহিত হবে।


2
আপনি প্রতিটি বস্তুর ক্লোন কল করতে পারবেন না , কারণ এটি সুরক্ষিত!
পাভেল মিনায়েভ

2

আইএমএইচও এটি এত সহজ:

  • #clone অ-ক্লোনযোগ্য বস্তুগুলিতে অবশ্যই কল করা উচিত নয়, সুতরাং এটি সর্বজনীন করা হয় না
  • #cloneObjectসঠিক শ্রেণীর অগভীর অনুলিপি পেতে ক্লোনেবেল বাস্তবায়নকারী সাবক্লাস ওবকে ডাকতে হবে

উপশ্রেণীর দ্বারা কলযোগ্য, তবে অন্যান্য শ্রেণীর দ্বারা নয় এমন পদ্ধতির সঠিক সুযোগটি কী?

এটা protected

Cloneableঅবশ্যই প্রয়োগকারী ক্লাসগুলি এই পদ্ধতিটি সর্বজনীন করে তুলবে যাতে এটি অন্যান্য শ্রেণি থেকে কল করা যায়।


0

ক্লোন () পদ্ধতির অভ্যন্তরীণভাবে 'ক্লোনযোগ্য বা না'র উদাহরণ রয়েছে। যা জাভা টিমটি কীভাবে ক্লোন () মেথডক্লোন () পদ্ধতির অপ্রয়োজনীয় ব্যবহারকে সীমাবদ্ধ রাখবে বলে মনে করে তা কেবল সাবক্লাস দ্বারা অ্যাক্সেস করা। যেহেতু অবজেক্টটি সমস্ত সাব ক্লাসের প্যারেন্ট ক্লাস, সুতরাং ক্লোন () পদ্ধতিটি সমস্ত ক্লাস দ্বারা ব্যবহার করা যেতে পারে যদি আমাদের 'ক্লোনযোগ্য উদাহরণ' এর উপরের চেক না থাকে। এই কারণেই জাভা টিম ক্লোন () পদ্ধতিতে পরীক্ষা করে 'ক্লোনযোগ্য' এর উদাহরণ হিসাবে ক্লোন () ব্যবহারের ভুল ব্যবহার সীমাবদ্ধ করার কথা ভাবতে পারে।

অতএব ক্লোনীয় প্রয়োগ করা ক্লাসগুলি যাই হোক না কেন অবজেক্ট শ্রেণির ক্লোন () পদ্ধতি ব্যবহার করতে পারে।

এটি যেহেতু এটি সুরক্ষিত তৈরি হয়েছে, এটি ক্লোনযোগ্য ইন্টারফেস প্রয়োগকারী কেবলমাত্র সাব-ক্লাসের জন্য উপলব্ধ। আমরা যদি এটি সর্বজনীন করতে চাই, তবে এই পদ্ধতিটি উপ-শ্রেণীর দ্বারা এটি প্রয়োগ করার সাথে সাথে তাদের ওভাররাইড করতে হবে।


-2

হ্যাঁ, আমি যে সমস্যার মুখোমুখি হয়েছিলাম। তবে আমি এই কোডটি প্রয়োগ করে এটি সমাধান করি

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;
    }
}

ঠিক যেমনটি আগে কেউ বলেছিল।


1
ক্লোননোটসপোর্টেড এক্সসেপশন একটি চেক করা ব্যতিক্রমের অন্য একটি উদাহরণ যা চেক করা উচিত নয় (এটির ব্যতিক্রম নয়, রানটাইম এক্সেকশন বাড়ানো উচিত)। যদিও ক্লাস সাইডে মেথড ক্লোন () ক্লোনেবেল প্রয়োগ করে এবং তাই এটি কখনও ক্লোননটসপোর্টড এক্সপশন নিক্ষেপ করবে না, সাইডক্লোন () অবশ্যই ব্যতিক্রমটিকে ধরা বা ঘোষণা করতে হবে। এটি ক্লোন () পদ্ধতিতে কেবলমাত্র অতিরিক্ত ব্যতিক্রম হ্যান্ডলিং শব্দকে যুক্ত করে।
ডেরেক মহর

-2

ঠিক আছে, সূর্যের বিকাশকারীরাও কেবল মানব, এবং তারা ক্লোন পদ্ধতিটি সুরক্ষিত হিসাবে বাস্তবায়নের জন্য বিশাল ভুল করেছিলেন, অ্যারেলিস্টে কোনও অ-কার্যকরী ক্লোন পদ্ধতি প্রয়োগ করার মতোই ভুলটি! সুতরাং, সাধারণভাবে, ক্লোন পদ্ধতি সম্পর্কে এমনকি অভিজ্ঞ জাভা প্রোগ্রামারদের সম্পর্কে আরও গভীর ভুল বোঝাবুঝি রয়েছে।

যাইহোক, আমি সম্প্রতি কোনও বিষয়বস্তু দিয়ে এটির কীভাবে নির্মিত এবং এটি কী আছে তা নির্ধারণের জন্য একটি দ্রুত এবং সহজ সমাধান খুঁজে পেয়েছি, আমার উত্তরটি এখানে দেখুন: অবজেক্ট.ক্লোন () ব্যবহার করে বাগ করুন


-3

আবার জাভা জেডিকে কাঠামো উজ্জ্বল চিন্তাভাবনা দেখায়:

ক্লোনযোগ্য ইন্টারফেসে "পাবলিক টি ক্লোন () থাকে না; পদ্ধতি কারণ এটি আরও বেশি বৈশিষ্ট্যের মতো কাজ করে (উদা। সিরিয়ালাইজেবল) যা এটি একটি উদাহরণকে ক্লোন করার অনুমতি দেয়।

এই নকশায় কোনও ভুল নেই কারণ:

  1. অবজেক্ট.ক্লোন () আপনার কাস্টম-সংজ্ঞায়িত শ্রেণীর সাথে আপনি যা চান তা করবে না।

  2. আপনার যদি মাইক্লাস ক্লোনযোগ্য => প্রয়োগ করে থাকে তবে আপনি "পাবলিক মাইক্লাস ক্লোন ()" দিয়ে ক্লোনটি ওভাররাইট করুন

  3. আপনার যদি মাইনইনফেরফেস ক্লোনযোগ্য এবং কিছু মাই ক্লাসগুলি মাইইন্টারফেস বাস্তবায়িত করে: কেবলমাত্র "পাবলিক মাই ইন্টারফেস ক্লোন () সংজ্ঞায়িত করুন;" ইন্টারফেসে এবং মাইআইন্টারফেস অবজেক্টগুলি ব্যবহার করে প্রতিটি পদ্ধতিতে তাদের ক্লোন করতে সক্ষম হবে, তাদের মাইক্লাস-শ্রেণি যাই হোক না কেন।


2
যদি আপনার শ্রেণি উত্তরাধিকার সূত্রে প্রাপ্ত হয় তবে আপনার বর্গ শ্রেণীর প্রয়োগগুলি নিরাপদ ক্লোন পদ্ধতি সরবরাহ না করা পর্যন্ত নিরাপদ থাকবে না। এছাড়াও, পদ্ধতি / বৈশিষ্ট্য ছাড়াই একটি ইন্টারফেস রাখা এক ধরণের অস্বাভাবিক ডিজাইনের শর্ত। এই ইন্টারফেস ক্লোনটিকে ক্লোন প্রয়োগ করতে বাধ্য করে না।
prap19
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.