আমাদের একটি ইন্টারফেসের পদ্ধতি বাস্তবায়ন @ ওভাররাইড করা উচিত?


432

একটি ইন্টারফেস পদ্ধতি প্রয়োগ করে এমন একটি পদ্ধতির সাথে @Overrideকি টীকাগুলি দেওয়া উচিত ?

এর javadoc Overrideটীকা বলেছেন:

ইঙ্গিত করে যে কোনও পদ্ধতি ঘোষণার উদ্দেশ্য একটি সুপারক্লাসে কোনও পদ্ধতি ঘোষণাকে ওভাররাইড করা। যদি কোনও পদ্ধতি এই টীকাটি দিয়ে টাইপ করা হয় তবে একটি সুপারক্লাস পদ্ধতিটি ওভাররাইড না করে, সংকলকদের একটি ত্রুটি বার্তা উত্পন্ন করার জন্য প্রয়োজনীয়।

আমি মনে করি না যে কোনও ইন্টারফেস প্রযুক্তিগতভাবে একটি সুপারক্লাস। অথবা এটা?

Question Elaboration


5
বাহ এই প্রশ্নটি আরও ছোট হতে পারে তবে এটি আমার প্রয়োজন প্রশ্ন। ধন্যবাদ
ড্যান রোজনস্টার্ক

1
@ ওভাররাইড নিবন্ধটির জন্য আমি প্রতিস্থাপনটি খুঁজে পাচ্ছি না (ওরাকল সম্প্রতি পুরাতন সান ব্লগগুলি সরিয়ে নিয়েছে)। আপনি এটি কীভাবে জানেন?
বিলটি

4
আমাদের এখন (2015) এর মধ্যে একটি @ ইমপ্লিমেন্ট (গুলি) টিকা দেওয়া উচিত। এটি বিষয়গুলি পরিষ্কার করে দেবে!
অ্যালেক্স

3
এখন (2015) এর মধ্যে আমাদের জাভা 8 এর সাথে ওভাররাইড ব্যবহার করা উচিত?
লরেঞ্জো স্কুটো

উত্তর:


305

যখনই সম্ভব আপনার @ ওভাররাইড ব্যবহার করা উচিত। এটি সাধারণ ভুলগুলি হওয়া থেকে বাধা দেয়। উদাহরণ:

class C {
    @Override
    public boolean equals(SomeClass obj){
        // code ...
    }
}

এটি সংকলন করে না কারণ এটি সঠিকভাবে ওভাররাইড করে না public boolean equals(Object obj)

একই পদ্ধতি এমন ইন্টারফেস প্রয়োগ করে ( ১.6 এবং কেবলমাত্র উপরে ) বা সুপার ক্লাসের পদ্ধতিটিকে ওভাররাইড করে।


150
নোট করুন যে আপনি জাভা 5 এ একটি ইন্টারফেস প্রয়োগকারী পদ্ধতিতে @ ওভাররাইড টীকা যুক্ত করতে পারবেন না - এটি একটি ত্রুটি তৈরি করে। এটি জাভা 6 এ অনুমোদিত
বিল মিশেল

17
উম, না, তা হয় না। প্রকৃতপক্ষে, একটি ইন্টারফেস প্রয়োগকারী পদ্ধতিগুলি পূরণ করার সময় অ্যাক্লিপস অটো-সন্নিবেশগুলি @ ওভাররাইড।
jjnguy

14
-1 উত্তর পর্যন্ত ইন্টারফেস পদ্ধতি প্রয়োগের ক্ষেত্রে জাভা 1.5 থেকে 1.6 এর বিভিন্ন আচরণ সম্পর্কে একটি উল্লেখ রয়েছে until আমি এটি মানুষের জন্য বিভ্রান্তিকর দিক হিসাবে দেখেছি এবং এটি সত্যিই একটি উল্লেখ যোগ্য।
গ্রুন্ডলেফ্লেক

2
যদি গ্রহগ্রহের অভিযোগ হয় তবে আপনার জেডিকে> 1.5 এ উন্নীত করুন এবং সংকলক সম্মতি স্তরটি 1.6 বা 1.7 এ পরিবর্তন করুন। এটি করতে ডানদিকে ক্লিক করুন আপনার প্রকল্প-> বৈশিষ্ট্য-> জাভা সংকলক এবং 1.5 এর চেয়ে বেশি একটি নির্বাচন করুন।
রোজ

1
কেউ কি এমন উদাহরণের কথা ভাবতে পারেন যা উত্তরটিকে ন্যায়সঙ্গত করে তোলে (বেস পদ্ধতিগুলিকে অগ্রাহ্য করার পরিবর্তে ইন্টারফেস প্রয়োগ করে)? আমার জন্য একটি বড় প্লাস এটি একটি নির্দিষ্ট পদ্ধতি কীভাবে এবং কীভাবে ব্যবহৃত হতে পারে তার পাঠকদের প্রত্যাশাগুলি সেট করে এটি।
জো লি-ময়েত

103

আমি বিশ্বাস করি যে জাভাক আচরণটি পরিবর্তিত হয়েছে - 1.5 এর সাথে এটি টীকা নিষিদ্ধ করেছে, 1.6 দিয়ে এটি হয় না। টীকাটি অতিরিক্ত সংকলন-সময় চেক সরবরাহ করে, সুতরাং আপনি যদি 1.6 ব্যবহার করেন তবে আমি এটির জন্য যাব।


1
অতিরিক্ত চেক কি?
মাইকেল কারম্যান

17
@ মিশেল আপনি খেয়াল করতে পারেন কোন ইন্টারফেস মুছে ফেলা হয়েছে কিনা।
সংঘুন লি লি

68

আপনার সাথে সর্বদা পদ্ধতিগুলি বর্জন করা উচিত @Overrideযদি এটি উপলব্ধ থাকে তবে আপনার ।

জেডিকে ৫-এ এর অর্থ সুপার ক্লাসের ওভাররাইড পদ্ধতি, জেডিকে 6, এবং in এর অর্থ সুপারক্লাসগুলির ওভাররাইডিং পদ্ধতি এবং ইন্টারফেসের প্রয়োগকরণ পদ্ধতিগুলি। কারণ হিসাবে পূর্বে উল্লিখিত হয়েছে, এটি কি কম্পাইলারটিকে ত্রুটিগুলি ধরার অনুমতি দেয় যেখানে আপনি মনে করেন যে আপনি কোনও পদ্ধতিকে ওভাররাইড করছেন (বা বাস্তবায়ন করছেন), কিন্তু আসলে একটি নতুন পদ্ধতি (ভিন্ন স্বাক্ষর) সংজ্ঞায়িত করছেন।

equals(Object)বনামequals(YourObject) উদাহরণ বিন্দুতে একটি প্রমিত ক্ষেত্রে দেখা যায়, কিন্তু একই যুক্তি ইন্টারফেস বাস্তবায়নের জন্য তৈরি করা যেতে পারে।

ইন্টারফেসের প্রয়োগের পদ্ধতিগুলি বর্ননা করা বাধ্যতামূলক না হবার কারণ আমি কল্পনা করেছিলাম যে জেডিকে 5 এটি একটি সংকলন ত্রুটি হিসাবে চিহ্নিত করেছে। যদি জেডি কে 6 এই টীকাকে বাধ্যতামূলক করে তোলে, তবে এটি পিছনের দিকে সামঞ্জস্যতা ভেঙে দেবে।

আমি কোনও গ্রহবাসী ব্যবহারকারী নই, তবে অন্যান্য আইডিইতে (ইন্টেলিজিজ), @Override প্রকল্পটি জেডিকে 6+ প্রকল্প হিসাবে সেট করা থাকলে ইন্টারফেসের পদ্ধতিগুলি প্রয়োগ টীকাটি কেবল যুক্ত করা হয়। আমি কল্পনা করব যে গ্রহণটিও একই রকম।

যাইহোক, আমি এই ব্যবহারের জন্য একটি ভিন্ন টীকা দেখতে পছন্দ করতাম, সম্ভবত কোনও @Implementsটিকা।



11

আপনি @Overrideযদি ইন্টারফেসে ঘোষিত পদ্ধতিটি (এর সংকলন ত্রুটি) প্রয়োগ করে থাকেন তবে জেডিকে 5.0 আপনাকে টীকাগুলি ব্যবহার করার অনুমতি দেয় না , তবে জেডিকে 6.0 এটি অনুমোদিত করে। সুতরাং আপনার প্রয়োজনীয়তা অনুসারে আপনি আপনার প্রকল্পের পছন্দটি কনফিগার করতে পারেন।


4

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


3

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


3

এটি জেডিকে নিয়ে কোনও সমস্যা নয়। এক্সিলিপ হেলিওসে, এটি প্রয়োগ করা ইন্টারফেস পদ্ধতিগুলির জন্য @ ওভাররাইড টীকাটি অনুমোদন করে, যেকোনও জেডিকে ৫ বা E.এক্লিপস গ্যালিলিওর জন্য, @ ওভাররাইড টীকা অনুমোদিত নয়, যা জেডিকে ৫ বা 6।


2

আমার জন্য, প্রায়শই এটির কারণেই কিছু কোডের জাভা 6 সংকলনের প্রয়োজন হয়। এটি মূল্যবান কিনা তা নিশ্চিত নয়।


2

জাভা 8-এ জাভাদোকটি পড়ে আপনি ইন্টারফেসের ওভাররাইডের ঘোষণায় নিম্নলিখিতটি পেতে পারেন:

এই টীকাটি সহ কোনও পদ্ধতিতে টীকাকরণ করা হলে কমপক্ষে নিম্নলিখিত সংস্থাগুলির একটি না ধরে থাকলে একটি ত্রুটি বার্তা উত্পন্ন করার জন্য সংকলকগুলির প্রয়োজন:

  • একটি সুপার টাইপে ঘোষিত পদ্ধতিটি পদ্ধতিটি ওভাররাইড বা প্রয়োগ করে।
  • পদ্ধতিটির একটি স্বাক্ষর রয়েছে যা public @ লিঙ্কপ্লেইন অবজেক্ট in এ ঘোষিত যে কোনও পাবলিক পদ্ধতির সাথে ওভাররাইড সমতুল্য}

সুতরাং, কমপক্ষে জাভা ৮-এ, আপনার একটি ইন্টারফেস পদ্ধতির প্রয়োগের জন্য @ ওভাররাইড ব্যবহার করা উচিত।


1

@Overrideযখন একটি ইন্টারফেস প্রয়োগ করে এমন একটি শ্রেণি তৈরির সময় আপনি "অযুচিত পদ্ধতি তৈরি করতে" বলবেন তখন গ্রহটি নিজেই টীকা যুক্ত করে ।


1

এতে অন্তর্ভুক্ত থাকা সমস্যাটি @Overrideএটি আপনাকে ভাবায় যে আপনি super.theOverridenMethod()পদ্ধতিটি কল করতে ভুলে গেছেন যা খুব বিভ্রান্তিকর । এটি স্ফটিক-পরিষ্কার হওয়া উচিত। সম্ভবত জাভা @Interfaceএখানে ব্যবহার করার প্রস্তাব দেওয়া উচিত । ওহ ভাল, আরও একটি অর্ধ assed জাভা বিশেষত্ব ...


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

1

জাভা 6 এবং পরবর্তী সংস্করণগুলিতে, আপনি @Overrideকোনও ইন্টারফেস প্রয়োগকারী পদ্ধতির জন্য ব্যবহার করতে পারেন ।

তবে, আমি মনে করি না যে এটি বোধগম্য: ওভাররাইডের অর্থ হ'ল আপনি সুপার ক্লাসে একটি পদ্ধতি নিয়ে এসেছেন এবং আপনি এটি সাব-ক্লাসে প্রয়োগ করছেন।

আপনি যদি কোনও ইন্টারফেস বাস্তবায়ন করে থাকেন তবে আমার মনে হয় আমাদের @Implementবা অন্য কিছু ব্যবহার করা উচিত তবে এটি নয় @Override


0

ইন্টারফেসের জন্য, @ ওভাররাইড ব্যবহারের ফলে সংকলনের ত্রুটি ঘটেছে। সুতরাং, আমি এটি অপসারণ করতে হবে।

ত্রুটি বার্তা " The method getAllProducts() of type InMemoryProductRepository must override a superclass method" গেছে।

এটি " One quick fix available: Remove @Override annotation." পড়াও

এটি ছিল ग्रहण 4.6.3, জেডিকে 1.8.0_144।


0

যে ক্লাসটি বাস্তবায়ন করছে এটি interfaceযদি একটি abstractশ্রেণি হয়, @Overrideতবে এটি বাস্তবায়নের কোনও interfaceপদ্ধতির জন্য তা নিশ্চিত করতে কার্যকর ; ছাড়া @Overrideএকটি abstractবর্গ ঠিক সূক্ষ্ম কম্পাইল এমনকি যদি বাস্তবায়ন পদ্ধতি স্বাক্ষর পদ্ধতি মিলছে না ঘোষণা করবে interface; মিলহীন interfaceপদ্ধতিটি বাস্তবায়নহীন হিসাবেই থাকবে। জাভা ডকটি @ জাওয়ের দ্বারা উদ্ধৃত হয়েছে

একটি সুপার টাইপে ঘোষিত পদ্ধতিটি পদ্ধতিটি ওভাররাইড বা প্রয়োগ করে

স্পষ্টভাবে একটি abstractসুপার বর্গ উল্লেখ করা হয় ; একটি interfaceসুপারটাইপ বলা যায় না। সুতরাং, কংক্রিট ক্লাসে পদ্ধতি বাস্তবায়নের @Overrideজন্য অপ্রয়োজনীয় এবং বুদ্ধিমান নয় interface

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