কেন জাভা ক্লাসগুলি প্রয়োগ করা ইন্টারফেস থেকে টীকা প্রাপ্ত করে না?


108

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

আরও মনে রাখবেন যে এই মেটা-টীকাটি সুপারিশগুলি থেকে উত্তরাধিকারসূত্রে টীকাগুলি তৈরি করে; প্রয়োগ করা ইন্টারফেসে টীকাগুলির কোনও প্রভাব নেই।

এর কারণ কী হতে পারে? রান্টটাইমে কোনও বস্তুর শ্রেণি প্রয়োগ করে এমন সমস্ত ইন্টারফেস সম্পর্কে জানার পক্ষে এই সিদ্ধান্ত নেওয়ার পিছনে কোনও ভাল কারণ থাকতে হবে এমনটা কঠিন কাজ নয়।

উত্তর:


130

আমি বলব কারণটি হ'ল অন্যথায় একাধিক-উত্তরাধিকারের সমস্যা দেখা দিতে পারে।

উদাহরণ:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD) @Inherited
public @interface Baz { String value(); }

public interface Foo{
    @Baz("baz") void doStuff();
}

public interface Bar{
    @Baz("phleem") void doStuff();
}

public class Flipp{
    @Baz("flopp") public void doStuff(){}
}

public class MyClass extends Flipp implements Foo, Bar{}

আমি যদি এটি করি:

MyClass.class.getMethod("doStuff").getAnnotation(Baz.class).value()

ফলাফল কি হতে চলেছে? 'বাজ', 'ফ্লেম' বা 'ফ্লপ'?


এই কারণে, ইন্টারফেসে টীকাগুলি খুব কমই কার্যকর।


9
ইন্টারফেসে টীকাগুলি কেবল তখনই কার্যকর যখন আপনার যদি এমন কোনও ফ্রেমওয়ার্ক থাকে যা তাদের সমর্থন করে। এই উদাহরণে বিটিডাব্লু getNnotation () বাতিল করে দেয়;)
পিটার ল্যারি

6
মানুষ, আমি জানি না। এই ক্ষেত্রে (যদি টাইপটি সেখানে না থাকত), আমি The field value is ambiguous.দুটি ইন্টারফেসের মতো বিভিন্ন মানের সাথে একই ধ্রুবক ঘোষণার মতো একটি অনুরূপ সংকলক ত্রুটি আশা করতাম । আমি জানি যে এই হল না তারা একটি ক্ষেত্র, কিন্তু টীকা মান এই সমস্ত কম্পাইল সময়ে সমাধান পেতে, না? আমরা এখানে যে বৈশিষ্ট্যটি অনুপস্থিত রয়েছি তা অনেক ক্ষেত্রে উচ্চ সহায়ক হবে। একটি পুরাতন পোস্ট পুনরুদ্ধার সম্পর্কে দুঃখিত, যাইহোক :)।
পেট্রা জেনেইক

7
এই সমস্যাগুলি সম্পর্কে বসন্তের ছেলেরা কীভাবে কাজ করেছে তা দেখার জন্য @ স্লানেকের বসন্তের উত্সগুলি দেখুন। দেখুন AnnotationUtils.findAnnotation (পদ্ধতি, annotationType)
শন প্যাট্রিক ফ্লয়েড

1
আমি এর সাথে মিলিয়ে কিছু লেখার কথা ভাবছিলাম। কিছু ধরণের সহজ ক্যাশে সহ, এটি আমার কাছে যাওয়ার মত মনে হচ্ছে। ধন্যবাদ! উপরের উদাহরণে এটির Fooটীকাটি পাওয়া যাবে ( এটিতে MyClassএকটি নেই, তারপরে ইন্টারফেসগুলি অনুসন্ধানের পরে সেটির ক্রম অনুসারে নেওয়া হবে implements) এবং এর ফলে "বাজ" মুদ্রণ করা হবে। কুল।
পেট্রা জেনেয়েক

2
@ ডাব্লুচারগিন সত্য, কারও পক্ষে টাইপোটি দেখাতে মাত্র 2 বছর সময় লেগেছে :-)
সান প্যাট্রিক ফ্লয়েড

35

থেকে Javadoc @Inherited জন্য:

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

অন্যদিকে, জেএসআর 305 বৈধকারকরা উত্তরাধিকার অনুসন্ধানের জন্য কিছু প্রকারের কাজ করে। আপনার যদি ক্লাসের শ্রেণিবিন্যাস থাকে:

//Person.java
@Nonnull
 public Integer getAge() {...}

//Student.java (inherits from Person)
@Min(5)
public Integer getAge() {...}

তারপর কার্যকর যাচাই উপর Student.getAge()হয় @Nonnull @Min(5)@Nonnullকোনও @Inheritedমেটা-টীকা নেই।


4
এটির একটি নির্বাচিত উত্তর হওয়া উচিত
Andrzej Purtak

3
আপনার উদাহরণটি আপনার উত্তরের সাথে বিরোধী, যা বলে যে @Inheritedএটি ক্লাস ব্যতীত অন্য কোনও কিছুর উপর প্রভাব ফেলবে না
ওলেগ মিখিভ

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