जावा एनोटेशन सदस्यों के लिए किस प्रकार का उपयोग किया जा सकता है?


238

आज मैं इस प्रलेखन के बाद अपना पहला एनोटेशन इंटरफ़ेस बनाना चाहता था और मुझे यह कंपाइलर त्रुटि मिली

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

जाहिर Objectतौर पर एनोटेशन सदस्य के प्रकार के रूप में इस्तेमाल नहीं किया जा सकता है। दुर्भाग्य से मुझे कोई जानकारी नहीं मिली कि किस प्रकार का सामान्य रूप से उपयोग किया जा सकता है।

यह मैंने परीक्षण-और-त्रुटि का उपयोग करते हुए पाया:

  • String → वैध
  • int → वैध
  • Integer → अमान्य (आश्चर्यजनक रूप से)
  • String[] → वैध (आश्चर्यजनक रूप से)
  • Object → अमान्य

शायद कोई व्यक्ति कुछ प्रकाश डाल सकता है जिस पर वास्तव में अनुमति दी जाती है और क्यों।


संभवतः यह एनोटेशन द्वारा भिन्न होता है - कृपया वह कोड दिखाएं जिसे आप लिखने का प्रयास कर रहे हैं।
djna

2
सवाल में जोड़ा गया। लेकिन मुझे नहीं लगता कि यह भिन्न है।
डैनियल रिकोव्स्की

जवाबों:


324

यह JLS की धारा 9.6.1 द्वारा निर्दिष्ट है । एनोटेशन सदस्य प्रकारों में से एक होना चाहिए:

  • प्राचीन
  • तार
  • एक एनम
  • एक और एनोटेशन
  • कक्षा
  • उपरोक्त में से किसी की एक सरणी

यह प्रतिबंधात्मक लगता है, लेकिन इसमें कोई संदेह नहीं है कि इसके कारण हैं।

यह भी ध्यान दें कि बहुआयामी सरणियों (जैसे String[][]) को उपरोक्त नियम द्वारा स्पष्ट रूप से मना किया गया है।

इस उत्तर में वर्णित कक्षा की सारणियों की अनुमति नहीं है ।


33
कोई उन पृष्ठों / दस्तावेजों को कैसे खोजता है? मैं StackOverlow पर पूछने से पहले हर बार Google को शपथ लेता हूं और कई जावा प्रश्न पर कोई JSL के लिए एक लिंक पोस्ट करता है जो मेरे प्रश्न का उत्तर देता है। मुझे Google के माध्यम से वे पृष्ठ क्यों नहीं मिले ?!
डैनियल रिकोस्की

10
JLS बहुत गूगल के अनुकूल नहीं है। आपको बस यह जानना होगा कि यह वहां है।
स्केफमैन

1
यही जानकारी सूर्य की साइट पर एनोटेशन गाइड में भी उपलब्ध है (यह पता चलता है कि googling): java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html
wds

1
हां, मुझे वह पृष्ठ मिला, लेकिन मुझे वह वाक्य याद आ गया होगा, जो उस गद्य पाठ में छिपा है। मैंने कुछ और तालिका या सूची जैसी चीज़ की तलाश की है।
डेनियल रिकोव्स्की

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_an

(मूल URL: https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations )


6
जावा 8 के साथ @Repeatable, अब इसकी आवश्यकता नहीं है।
मोर्दकै

11

एनोटेशन की अवधारणा वास्तव में मेरी परियोजना के डिजाइन के साथ अच्छी तरह से फिट बैठती है, जब तक मुझे एहसास नहीं हुआ कि एनोटेशन में आपके पास जटिल डेटाैटिप्स नहीं हो सकते। उस वर्ग की तात्कालिक वस्तु के बजाय जो मैं तत्काल प्राप्त करना चाहता था, उसके वर्ग का उपयोग करके मैंने इसे प्राप्त किया। यह सही नहीं है, लेकिन जावा शायद ही कभी हो।

@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
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.