জাভা টিকা সদস্যদের জন্য কোন ধরণের ব্যবহার করা যেতে পারে?


238

আজ আমি এই ডকুমেন্টেশনের পরে আমার প্রথম টিকাটি ইন্টারফেস তৈরি করতে চেয়েছিলাম এবং আমি এই সংকলক ত্রুটি পেয়েছি

Invalid type for annotation member":
public @interface MyAnnotation {
    Object myParameter;
    ^^^^^^
}

স্পষ্টতই Objectকোনও টিকাশী সদস্যের ধরণ হিসাবে ব্যবহার করা যায় না। দুর্ভাগ্যক্রমে আমি কোন ধরণের তথ্য সাধারণভাবে ব্যবহার করতে পারি তার কোন তথ্য পাইনি।

এটি আমি ট্রায়াল-এন্ড ত্রুটি ব্যবহার করে খুঁজে পেয়েছি:

  • String Id বৈধ
  • int Id বৈধ
  • Integer → অবৈধ (আশ্চর্যজনকভাবে)
  • String[] Id বৈধ (আশ্চর্যজনকভাবে)
  • Object → অবৈধ

সম্ভবত যে কেউ প্রকৃতপক্ষে কীভাবে অনুমোদিত এবং কেন তা নিয়ে কিছু আলোকপাত করতে পারে।


সম্ভবত এটি টীকা অনুসারে পরিবর্তিত হয় - দয়া করে আপনি যে কোডটি লেখার চেষ্টা করছেন তা প্রদর্শন করুন।
djna

2
প্রশ্ন যুক্ত হয়েছে। তবে আমি মনে করি না এটির ভিন্নতা আছে।
ড্যানিয়েল রিকোভস্কি

উত্তর:


324

এটি জেএলএস এর 9.6.1 বিভাগ দ্বারা নির্দিষ্ট করা হয়েছে । টীকা সদস্যের প্রকারগুলি অবশ্যই একটি হতে হবে:

  • আদিম
  • দড়ি
  • একটি এনুম
  • অন্য একটি টিকা
  • শ্রেণী
  • উপরের যে কোনও একটি অ্যারে

এটি সীমাবদ্ধ বলে মনে হয়, তবে এর কারণগুলির মধ্যে কোনও সন্দেহ নেই।

এছাড়াও নোট করুন যে বহুমাত্রিক অ্যারেগুলি (উদাহরণস্বরূপ String[][]) উপরোক্ত নিয়ম দ্বারা সুস্পষ্টভাবে নিষিদ্ধ।

এই উত্তরে বর্ণিত শ্রেণীর অ্যারেগুলি অনুমোদিত নয় ।


33
কীভাবে এই পৃষ্ঠাগুলি / নথিগুলি পাওয়া যায়? আমি স্ট্যাকওভারলোতে জিজ্ঞাসা করার আগে এবং গুগল শপথ করি এবং অনেক জাভা প্রশ্নে কেউ জেএসএলে একটি লিঙ্ক পোস্ট করে যা আমার প্রশ্নের উত্তর দেয়। গুগলের মাধ্যমে আমি কেন এই পৃষ্ঠাগুলি খুঁজে পাই না ?!
ড্যানিয়েল রিকোভস্কি

10
জেএলএস খুব গুগল-বান্ধব নয়। আপনার কেবল এটি জানতে হবে যে এটি আছে।
skaffman

1
একই তথ্যটি সূর্যের সাইটে টীকাগুলি নির্দেশিকাতেও পাওয়া যায় (এটি গুগলিংটি
wd

1
হ্যাঁ, আমি সেই পৃষ্ঠাটিও পেয়েছি, তবে আমি অবশ্যই এই বাক্যটি মিস করেছি, that সমস্ত গদ্য পাঠ্যে লুকানো। আমি আরও কিছু টেবিল বা তালিকার মতো সন্ধান করেছি।
ড্যানিয়েল রিকোভস্কি

13
উপরের তালিকা থেকে যা অনুপস্থিত তা হ'ল "টিকা"। আপনার কাছে একটি টীকা থাকতে পারে যাতে অন্য একটি টিকা বা অন্য টীকাগুলির একটি অ্যারে রয়েছে।
ম্যাট

58

আমি উপলব্ধ টাইপগুলির জন্য স্কাফম্যানের সাথে একমত।

অতিরিক্ত বাধা: এটি একটি সংকলন-সময় ধ্রুবক হতে হবে

উদাহরণস্বরূপ, নিম্নলিখিতগুলি নিষিদ্ধ:

@MyAnnot("a" + myConstantStringMethod())
@MyAnnot(1 + myConstantIntMethod())

31

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

উদাহরণ স্বরূপ:

@ComplexAnnotation({
    @SimpleAnnotation(a="...", b=3),
    @SimpleAnnotation(a="...", b=3),
    @SimpleAnnotation(a="...", b=3)
})
public Object foo() {...}

যেখানে SimpleAnnotationহয়

@Target(ElementType.METHOD)
public @interface SimpleAnnotation {
    public String a();
    public int b();
)

এবং ComplexAnnotationহয়

@Target(ElementType.METHOD)
public @interface ComplexAnnotation {
    public SimpleAnnotation[] value() default {};
)

উদাহরণ থেকে নেওয়া: http://web.archive.org/web/20131216093805/https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations

(মূল ইউআরএল: https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations )


6
জাভা 8 দিয়ে @Repeatable, এটি আর দরকার হয় না।
মর্দচাই

11

আমার প্রকল্পের নকশার সাথে টীকাগুলির ধারণাটি সত্যিই খুব ভাল ফিট করে until আমি class শ্রেণীর তাত্ক্ষণিক বস্তুর পরিবর্তে যা ইনস্ট্যান্ট করতে চেয়েছিলাম তার ক্লাসটি ব্যবহার করে আমি এটির কাছাকাছি পৌঁছেছি। এটি নিখুঁত নয়, তবে জাভা খুব কমই হয়।

@interface Decorated { Class<? extends PropertyDecorator> decorator() }

interface PropertyDecorator { String decorate(String value) }

class TitleCaseDecorator implements PropertyDecorator {
    String decorate(String value)
}

class Person {
    @Decorated(decorator = TitleCaseDecorator.class)
    String name
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.