2005 में, जावा 5 के आगमन के साथ, हम एनोटेशन नामक नई संस्थाओं के बारे में जानने लगे।

एनोटेशन सिंटैक्टिक मेटाडेटा का एक विशेष रूप है जिसे कोड में घोषित किया जा सकता है। संकलन या रनटाइम पर कोड का विश्लेषण करने के लिए उनका उपयोग किया जाता है। आप एनोटेशन को लेबल, टैग या कंपाइलर संकेत के रूप में सोच सकते हैं।

आपने शायद पहले एनोटेशन देखे होंगे। उदाहरण के लिए, पैरेंट क्लास के किसी मेथड को ओवरराइड करते समय, हम मेथड से पहले @Override लिखते हैं। यह एनोटेशन इंगित करता है कि माता-पिता की विधि चाइल्ड क्लास में ओवरराइड हो जाएगी।

वाक्य - विन्यास:


@Override
public int hashCode() {
      return super.hashCode();
}

मैं तुरंत ध्यान देना चाहता हूं कि एनोटेशन केवल तरीकों पर लागू नहीं होते हैं। उनका उपयोग पैकेज, कक्षाओं, विधियों, क्षेत्रों और मापदंडों के साथ किया जाता है।

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

Java 5 से पहले, वे एक ऐसे इंटरफ़ेस का उपयोग करते थे जो वह नहीं करता था जो हम इंटरफ़ेस से करने की अपेक्षा करते हैं। इसका कोई तरीका नहीं था और कोई अनुबंध नहीं था। यह सिर्फ एक वर्ग को किसी तरह से विशेष के रूप में चिन्हित करता है।

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

जैसा कि हमने देखा है, एनोटेशन की शुरुआत के बाद भी मार्कर इंटरफेस चालू रहता है।

एनोटेशन बनाम मार्कर इंटरफेस:


@MyAnnotation
public class MyClass {}

public class MyClass implements MarkerInterface {}

दोनों दृष्टिकोणों का उद्देश्य एक ही है, लेकिन उनके कार्यान्वयन में स्पष्ट अंतर है। उदाहरण के लिए, एक इंटरफ़ेस और एक एनोटेशन पर विचार करें जो इंगित करता है कि एक वर्ग एक विशेष प्रकार से संबंधित है।

यदि हम एक इंटरफ़ेस का उपयोग कर रहे हैं, तो हम कक्षा को चिह्नित करते हैं। यदि हम इसे गलत तरीके से उपयोग करते हैं और कोई त्रुटि होती है, तो हम संकलन के समय समस्या का पता लगा लेंगे और प्रोग्राम नहीं चलेगा।

एनोटेशन के साथ, सब कुछ इतना सरल नहीं है: यहां रनटाइम पर त्रुटि का पता लगाया जाएगा, जिसका अर्थ है कि कार्यक्रम शुरू हो जाएगा, लेकिन आश्चर्यजनक रूप से यह समाप्त नहीं होगा।

ध्यान दें कि यदि हमें भविष्य में उपयोग के लिए किसी वर्ग को चिह्नित करने की आवश्यकता है, तो इसके उदाहरणों को एक विशिष्ट विधि में पारित किया जाना चाहिए:


public class MyInteger implements Sum {}
interface Sum {};

public static void main(String[] args) throws IOException {
        increase(new MyInteger());
}
 
public static void increase(Sum count) {
        // TODO
}

एक मार्कर इंटरफ़ेस यहां सबसे अच्छा काम करता है।

एनोटेशन का उपयोग करना सबसे अच्छा होता है जब हमें कुछ और चाहिए, जैसे एनोटेशन का समर्थन करने वाले पैरामीटर।

आइए JDK में मानक एनोटेशन देखें:

टिप्पणी विवरण उदाहरण
@Override निर्दिष्ट करता है कि एक विधि सुपरक्लास की विधि को ओवरराइड करती है या एक सार वर्ग या इंटरफ़ेस की विधि लागू करती है।

@Override
public int hashCode() {
        return super.hashCode();
}
@ बहिष्कृत कोड को बहिष्कृत के रूप में चिह्नित करता है।

@Deprecated
public abstract void method();
@चेतावनियों को दबाना एनोटेटेड तत्व के लिए कंपाइलर चेतावनियों को अक्षम करता है। ध्यान दें कि यदि आपको चेतावनियों की कई श्रेणियों को अक्षम करने की आवश्यकता है, तो उन्हें घुंघराले ब्रेसिज़ में संलग्न होना चाहिए, उदाहरण के लिए @SuppressWarnings({"unchecked", "cast"})

public class DocumentsFolder {
   private List documents;

   @SuppressWarnings("unchecked")
public void addDocument(String document) {
            documents.add(document);
   }
}

इस उदाहरण में, हम एक ऐसी सूची में जोड़ने की कोशिश कर रहे हैं जिसमें परिभाषित प्रकार (एक सामान्य प्रकार) नहीं है। संकलक हमें इसके बारे में चेतावनी देगा। यह बहुत उपयोगी है, लेकिन कभी-कभी बहुत अधिक "चेतावनियां" होती हैं और वे शोर कर सकती हैं। आप इस विधि एनोटेशन का उपयोग कर सकते हैं और एक तर्क के रूप में एक प्रकार की संकलक चेतावनी निर्दिष्ट कर सकते हैं। बहुत सारे मार्कर हैं, इसलिए उन सभी को याद रखने की चिंता न करें — आईडीईए आमतौर पर आपको बताएगा कि कौन सा जोड़ना है।

एकाधिक तर्कों के साथ एक और उदाहरण:


@SuppressWarnings({"unchecked", "deprecated"})