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

आइए एक एनोटेशन बनाने का प्रयास करें।

ऐसा करने के लिए, एक फ़ाइल बनाएँ, लेकिन क्लास या इंटरफ़ेस लिखने के बजाय , @interface लिखें । यह हमारे एनोटेशन के लिए फाइल होगी। एनोटेशन की आंतरिक संरचना एक इंटरफ़ेस के समान होती है।


public @interface Sum {
   int sum() default 0;
}

@interface इंगित करता है कि यह एक एनोटेशन है,
डिफ़ॉल्ट कहता है कि पैरामीटर का एक विशिष्ट डिफ़ॉल्ट मान होगा।

ता-दा! हमने एक एनोटेशन बनाया! सैद्धांतिक रूप से हम इसे पहले से ही उपयोग कर सकते हैं, लेकिन पहले इसे कॉन्फ़िगर करना बेहतर होगा।

कॉन्फ़िगरेशन के बिना, हमारे एनोटेशन को किसी भी चीज़ (कक्षाओं, विधियों, विशेषताओं आदि) पर लागू किया जा सकता है, इसलिए इस बिंदु पर इसका उपयोग करने का कोई मतलब नहीं है। अजीब लग सकता है, हमारे एनोटेशन को अन्य एनोटेशन के साथ एनोटेट करने की आवश्यकता है!

चलिए @Target से शुरू करते हैं ।

@ लक्ष्य एनोटेशन (जावा 1.5 के बाद से प्रासंगिक) एनोटेशन लागू करने की क्षमता को प्रतिबंधित करता है। उपयोग को एक निश्चित स्तर तक सीमित करने के लिए, हमें यह इंगित करने के लिए @Target एनोटेशन के लिए एक तर्क पारित करने की आवश्यकता है कि इसे किस प्रकार पर लागू किया जा सकता है। यहाँ कुछ आमतौर पर इस्तेमाल किए जाने वाले प्रकार हैं:

@Target(ElementType.PACKAGE) संकुल के लिए
@Target(ElementType.TYPE) कक्षाओं के लिए
@Target(ElementType.CONSTRUCTOR) निर्माणकर्ताओं के लिए
@Target(ElementType.METHOD) विधियों के लिए
@Target(ElementType.FIELD) एक वर्ग में विशेषताओं (चर) के लिए
@Target(ElementType.PARAMATER) विधि मापदंडों के लिए
@Target(ElementType.LOCAL_VARIABLE) स्थानीय चर के लिए

यदि आपको कई प्रकार के एनोटेशन की आवश्यकता है, तो आप एक सरणी के रूप में कई तर्क पारित कर सकते हैं:


@Target({ ElementType.PARAMETER, ElementType.LOCAL_VARIABLE })

कॉन्फ़िगरेशन का अगला महत्वपूर्ण भाग @Retention एनोटेशन है।

यह एनोटेशन कोड जीवन चक्र के उन हिस्सों को इंगित करता है जिनमें हमारा एनोटेशन उपलब्ध होगा:

अवधारण नीति। स्रोत स्रोत प्रतिधारण नीति के साथ चिह्नित एनोटेशन को रन टाइम पर छोड़ दिया जाता है।
रिटेंशनपॉलिसी.क्लास CLASS प्रतिधारण नीति के साथ चिह्नित एनोटेशन .class फ़ाइल में लिखे जाते हैं, लेकिन रन टाइम पर हटा दिए जाते हैं।
अवधारण नीति। रनटाइम RUNTIME अवधारण नीति के साथ चिह्नित एनोटेशन रन टाइम पर बने रहते हैं और रन टाइम पर हमारे प्रोग्राम में एक्सेस किए जा सकते हैं।

कॉन्फ़िगरेशन के लिए आप कुछ और एनोटेशन का उपयोग कर सकते हैं:

टिप्पणी कीमत
@विरासत में मिला इंगित करता है कि व्युत्पन्न वर्ग एनोटेशन के मूल वर्ग के कार्यान्वयन को प्राप्त करता है।
@ प्रलेखित यह इंगित करता है कि एनोटेशन जनरेटेड Javadoc प्रलेखन में शामिल किया जाएगा।

आइए अब अपना स्वयं का एनोटेशन बनाने का प्रयास करें।

हम एक एनोटेशन बनाएंगे जो कक्षाओं और विधियों के लिए है और इसमें कोड के लेखक और संस्करण के बारे में जानकारी शामिल है:


    @Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Info {
   String author() default "Author";
   String version() default "0.0";
}

हम अपने एनोटेशन को विधियों और कक्षाओं में लागू कर सकते हैं। हमारे एनोटेशन का मेटाडेटा रन टाइम पर उपलब्ध होगा। हमारे एनोटेशन के मापदंडों पर ध्यान दें: हम दो तर्क (लेखक और संस्करण) प्रदान कर सकते हैं, या हम उन्हें छोड़ सकते हैं। यदि हम उन्हें छोड़ देते हैं, तो निर्दिष्ट डिफ़ॉल्ट मान ( डिफ़ॉल्ट "लेखक" और डिफ़ॉल्ट "0.0" ) का उपयोग किया जाएगा।

यह ध्यान देने योग्य है कि हमें पैरामीटर के लिए डिफ़ॉल्ट मान निर्दिष्ट करने की आवश्यकता नहीं है। इस स्थिति में, पैरामीटर अनिवार्य हो जाता है।

तर्क पारित करते समय, हमें अंकन मान = "मान" का उपयोग करके संबंधित पैरामीटर निर्दिष्ट करना होगा । पैरामीटर को हमेशा स्पष्ट रूप से नामित किया जाना चाहिए, भले ही एनोटेशन में एक ही पैरामीटर हो।

आइए अपने एनोटेशन को कुछ वर्गों पर लागू करें:


@Info
public class MyClass1 {
   @Info
   public void myClassMethod() {}
}
 
@Info(version = "2.0")
public class MyClass2 {
   @Info(author = "Anonymous")
   public void myClassMethod() {}
}
 
@Info(author = "Anonymous", version = "2.0")
public class MyClass3 {
   @Info(author = "Anonymous", version = "4.0")
   public void myClassMethod() {}
}