যদি আমার আইডিই এত স্মার্ট হয় তবে কেন আমাকে "ক্লোন ()" কাস্ট করা দরকার?


13

আমার কোডটি টাইপ করার সময় আমার আইডিই ( নেটবিয়ান ) টাইপ আমার চেক Collectionsকরে। তবে, কেন আমাকে প্রত্যাবর্তিত অবজেক্টটি ফেলে দিতে হবে Object.clone()? যা ঠিক আছে। কোন ক্ষতি কোন ফাউল। কিন্তু তবুও, আমি বুঝতে পারি না।

টাইপ চেকিং, castালাই ছাড়াই, প্রত্যাশিত বস্তুটি Object.clone()সম্ভব নয়? জেনেরিক্স ফ্রেমওয়ার্ক আমার মনে আইডিই পরীক্ষা পারে তোলে টাইপ "ডান পাশ বস্তুর উল্লেখ = ভোটদান যখন আমি টাইপিং am ছাড়া" মার্ক? আমি পাই না।

সংযোজন
আমার ব্যবহারের কেসটি কেবলমাত্র আমার একটি ব্যক্তিগত Calendarক্ষেত্র ছিল, পাবডেট । আমি লিখতে যাচ্ছি:

Calendar getPubdate() {
    return pubdate;
}

তবে একটি ঝুঁকি রয়েছে যে আমন্ত্রণকারী আমার পাবডেটটি সংশোধন করতে পারে , তাই আমি একটি অনুলিপি ফিরিয়ে দিয়েছি:

Calendar getPubdate() {
    return (Calendar) pubdate.clone();
}

তারপরে, আমি ভাবলাম কেন আমাকে কাস্ট করা দরকার pubdate.clone()। পদ্ধতিটির স্বাক্ষরের ঠিক সেখানে টাইপ রয়েছে। নেটবিয়ানদের এটি খুঁজে বের করতে সক্ষম হওয়া উচিত। এবং নেটবিনগুলি দেখে মনে হয়েছে এটি নিয়েও তেমন কিছু করছে Collections


5
একটি সংক্ষিপ্ত (!) কোড উদাহরণ সহায়ক হবে।
ডক ব্রাউন

78
আইডিই ভাষা থেকে পৃথক পৃথক, সুতরাং জাভা কীভাবে কাজ করে তার উপর কীভাবে স্মার্ট নেটবিনগুলির কোনও প্রভাব নেই।
জ্যাকবিবি

7
দ্রষ্টব্য, রিটার্ন ধরণের covariance এর কারণে, এটির পরিবর্তে ফিরে MyObjectআসার পরামর্শ দেওয়া হয় - এটি এই পুরো সমস্যাটি সরিয়ে দেয়। এটি কখনই ব্যবহার না করার পরামর্শ দেওয়া হয় (কার্যকর জাভা আইটেম # 11)। clone()Objectclone()
বরিস স্পাইডার

আপনার প্রশ্নের জোর আমি বা 'castালাই "ক্লোন ()" ? কারণ পূর্ববর্তী থেকে উত্থাপিত প্রশ্নটি আসলে পরবর্তীকালের চেয়ে অনেক ভাল প্রশ্ন হতে পারে।
user541686

যখন আমি প্রশ্নের শিরোনামটি পড়ি তখন কেবলমাত্র আমি মনে করি this.clone()প্রোগ্রামার অবজেক্টে, বিশেষত মঙ্গলবার প্রকাশের পরে বুধবার রাতে। দুঃখিত তবে আমাকে এই মন্তব্যটি লিখতে হবে .. কেন স্মার্ট আইডিই আমাদের জন্য সমস্ত বাগ ঠিক করতে পারে না LOL
মাই

উত্তর:


53

কেন আমাকে ফেরত দেওয়া বস্তুটি ফেলে দিতে হবে Object.clone()?

কারণ এটি ফিরে আসে Object

জেনেরিক্স ফ্রেমওয়ার্ক আমার মনে আইডিই পরীক্ষা পারে তোলে টাইপ "ডান পাশ বস্তুর উল্লেখ = ভোটদান যখন আমি টাইপিং am ছাড়া" মার্ক? আমি পাই না।

Object.clone জেনেরিক নয়।

cloneডিজাইন করার সময় জেনেরিকগুলি যদি উপস্থিত থাকে তবে সম্ভবত এটি এ জাতীয় দেখতে পাওয়া হত (এফ-বাউন্ডেড পলিমারফিজম ব্যবহার করে):

interface Cloneable<T extends Cloneable<T>> {
  T clone();
}

জাভাতে যদি একটি মাইটাইপ বৈশিষ্ট্য থাকে তবে এটি সম্ভবত এটির মতো দেখাবে:

interface Cloneable {
  this clone();
}

তবে জেনারিক্সের Object.cloneনকশা তৈরি করার সময় অস্তিত্ব ছিল না এবং জাভাতে মাইটাইপস নেই, সুতরাং টাইপ-অনিরাপদ সংস্করণটি Object.cloneআমাদের কাজ করতে হবে।


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

1
জাভা 8 (এবং কিছুটা হলেও জাভা 7) ধরনের সঙ্গে @konishiki অনুমান , যাতে কোন সহায়তা, আভাসিত করা প্রকারের আইডিই চাহিদা প্রদান করার জন্য। এর জন্য আংশিক সংকলন প্রয়োজন। টাইপ অনুমানের আগে, স্বয়ংক্রিয়ায়িতকরণের জন্য কোনও সংকলনের প্রয়োজন নেই।
বোরিস স্পাইডার

@ বোরিস্টস্পাইডার এই মতামতের জন্য আপনাকে অনেক ধন্যবাদ! আমার অবশ্যই আরও কিছু পরীক্ষা / চিন্তা করা দরকার। খুব বেশি প্রশংশিত.
কোনিশিকি

আপনার পাস করার দরকার হবে কেন original?
ক্লাশসফট

@ ক্ল্যাশসফ্ট: সুস্পষ্ট ফাংশনাল প্রোগ্রামিং সংস্করণটি মানিয়ে নেওয়ার সময় বোকা থিঙ্কো। ধন্যবাদ।
জার্গ ডব্লু মিটাগ

26

এটি কোনও আইডিইর বৈশিষ্ট্য নয়, তবে ভাষার সংজ্ঞা।

একটি আইডিই আপনাকে প্রোগ্রামিংয়ের ভাষা আরও দক্ষতার সাথে ব্যবহার করতে সহায়তা করে, এটি সেই ভাষার শব্দার্থকে পরিবর্তন করে না। এর অর্থ হ'ল কোনও সম্পাদক সাহায্যকারী আপনি যেটি চান তা স্পষ্ট হয়ে গেলে স্বয়ংক্রিয়ভাবে একটি কাস্ট সন্নিবেশ করানো যেতে পারে, তবে এটি কেবল ভাষার নিয়মগুলি ভঙ্গ করতে পারে এবং যে কোডটি সংকলন করে না সেটিকে বৈধ বলে ভান করতে পারে না।

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


এটি ঘটেছিল: আমি নিশ্চিত যে কোড সমাপ্তি একটি আইডিই বৈশিষ্ট্য (প্রতিবিম্বের মাধ্যমে সম্পন্ন)। এবং আমি যে অটো টাইপ যাচাইয়ের কথা বলছিলাম তা আইডিইতে ঘটে যায় (পটভূমি সংকলনের মাধ্যমে)। আমি আশা করি এটিই চলছে।
কোনিশিকি 12

1
আইডিই করতে খুব সহজেই ভাষা বৈশিষ্ট সব নিয়ম ভঙ্গ এবং মাত্র কোন পথে কোড কম্পাইল। আমি জানি নেটবিয়ানস এবং এক্সলিপস উভয়ই তাদের নিজস্ব সংকলক ব্যবহার করেন, উদাহরণস্বরূপ। সুতরাং সেই ক্ষেত্রে আইডিই এবং সংকলক কার্যকরভাবে একই জিনিস। এটি একটি ভাল ধারণা বলছেন না, তবে সি সংকলকগণ অবশ্যই এটি সর্বদা করেন।
মাইকেলস

@ মিশেলস সি ভাষার স্পেসিফিকেশন বাস্তবায়নের মধ্যে উল্লেখযোগ্য পরিবর্তনের মঞ্জুরি দেওয়ার জন্য ডিজাইন করা হয়েছে, যাতে বিভিন্ন বিক্রেতারা বিভিন্ন সম্ভাব্য পদ্ধতির মধ্যে চয়ন করতে এবং অতিরিক্ত বৈশিষ্ট্য যুক্ত করতে পারে। এটি স্পেসিফিকেশনে অস্পষ্টতার বিভিন্ন ক্ষেত্র তৈরি করে, যা এই পরিবর্তনের অনুমতি দেওয়ার জন্য প্রয়োজনীয়। "সি" নামটি ট্রেডমার্কযুক্ত নয়, সুতরাং কেউ এই শব্দটির ব্যবহার নিয়ন্ত্রণ করে না। জাভা স্পেসিফিকেশন যতটা সম্ভব অস্পষ্টতা দূর করার জন্য ডিজাইন করা হয়েছে, এবং জাভা ট্রেডমার্কযুক্ত এবং ট্রেডমার্ক ধারক বলবত করে যে এটি কেবল অনুগত বাস্তবায়নে ব্যবহার করা যেতে পারে।
জুলে

আধুনিক আইডিই এর যেভাবেই হোক একটি সংকলক প্রয়োজন। কোড সমাপ্তির ইঙ্গিতগুলির জন্য কার্সার পার্স করার আগে কোডটি আবশ্যক। এবং অবশ্যই জেনেরিকগুলি (বা সি ++ টেম্পলেট) এর সাথে কেবল একটি পার্সার নয়, একটি সম্পূর্ণ সংকলক প্রয়োজন।
এমসাল্টার্স

3

এটি অবজেক্ট.ক্লোন পদ্ধতির স্বাক্ষরের প্রকারের কারণে। প্রকারের স্বাক্ষরটিতে বলা হয় যে পদ্ধতিটি অবজেক্ট টাইপের কোনও অবজেক্ট ফিরিয়ে দেবে।

protected Object clone() throws CloneNotSupportedException

সংগ্রহগুলি স্বয়ংক্রিয়ভাবে কাস্টিংয়ের ধরণের বিকল্প হিসাবে তথাকথিত জেনেরিক প্রকারগুলি ব্যবহার করবে।

সুতরাং আপনার যদি এই কোডটি থাকে:

List<Integer> ints = Arrays.asList(1,2,3);
int x = ints.get(0);`

সংকলক পর্দার পিছনে আপনার জন্য কাস্টগুলি যুক্ত করবে, তাই কোডটি আসলে হবে:

List ints = Arrays.asList(1,2,3);
int x = (Integer)ints.get(0);

0

সম্পূর্ণতার জন্য, জাভা 5 যেহেতু, কোভেরিয়েন্ট রিটার্নের ধরণের অনুমতি রয়েছে । সুতরাং আপনি নিম্নলিখিত লিখতে পারেন:

public MyObject implements Cloneable {
  @Override
  public MyObject clone() {
    try {
      return (MyObject)super.clone();
    } catch (CloneNotSupportedException e) {
      throw new AssertionError();
    }
  }
}

এটি দিয়ে, নিম্নলিখিত কোডটি আইনী:

MyObject original = new MyObject();
MyObject clone = original.clone();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.