2005 मध्ये, Java 5 च्या आगमनाने, आम्हाला भाष्य नावाच्या नवीन घटकांची ओळख झाली.

भाष्य हे वाक्यरचनात्मक मेटाडेटाचे एक विशेष प्रकार आहेत जे कोडमध्ये घोषित केले जाऊ शकतात. ते संकलनाच्या वेळी किंवा रनटाइमच्या वेळी कोडचे विश्लेषण करण्यासाठी वापरले जातात. तुम्ही लेबल, टॅग किंवा कंपाइलर इशारा म्हणून भाष्याचा विचार करू शकता.

तुम्ही कदाचित यापूर्वी भाष्ये पाहिली असतील. उदाहरणार्थ, पॅरेंट क्लासची पद्धत ओव्हरराइड करताना, आम्ही पद्धतीच्या आधी @Override लिहितो. हे भाष्य सूचित करते की पालकांची पद्धत बाल वर्गात ओव्हरराइड केली जाईल.

मांडणी:

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

मला ताबडतोब लक्षात घ्यायचे आहे की भाष्ये केवळ पद्धतींवर लागू होत नाहीत. ते पॅकेज, वर्ग, पद्धती, फील्ड आणि पॅरामीटर्ससह वापरले जातात.

भाष्य कसे कार्य करते हे समजून घेण्यासाठी, प्रथम मार्कर इंटरफेसच्या संकल्पनेशी परिचित होऊ या. जावाच्या आगमनापासून, विकसकांना वर्गांवर विशिष्ट क्रिया करण्यासाठी नेहमी चिन्हांकित करण्याचा मार्ग आवश्यक असतो.

Java 5 च्या आधी, त्यांनी एक इंटरफेस वापरला ज्याने आम्ही इंटरफेसच्या अपेक्षा केल्याप्रमाणे करत नाही. त्यात कोणत्याही पद्धती आणि करार नव्हता. याने फक्त वर्गाला काही प्रकारे विशेष म्हणून चिन्हांकित केले आहे.

अशा इंटरफेसला मार्कर इंटरफेस असे म्हणतात. नावावरून तुम्ही अंदाज लावू शकता की त्याचा उद्देश JVM, कंपाइलर किंवा काही लायब्ररीसाठी वर्ग चिन्हांकित करणे आहे. काही मार्कर इंटरफेस, जसे की सीरियलाइज करण्यायोग्य , राहतात. हा मार्कर इंटरफेस आम्हाला सूचित करतो की वर्गाची उदाहरणे अनुक्रमित केली जाऊ शकतात.

आम्ही पाहिल्याप्रमाणे, मार्कर इंटरफेस भाष्यांच्या परिचयानंतरही चालू राहतात.

भाष्ये विरुद्ध मार्कर इंटरफेस:

@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
public int hashCode() {
        return super.hashCode();
}
@नापसंत कोड नापसंत म्हणून चिन्हांकित करते.
@Deprecated
public abstract void method();
@SuppressWarnings भाष्य केलेल्या घटकासाठी कंपाइलर चेतावणी अक्षम करते. लक्षात ठेवा की तुम्हाला चेतावणींच्या अनेक श्रेणी अक्षम करायची असल्यास, ते कुरळे ब्रेसेसमध्ये बंद केलेले असले पाहिजेत, उदाहरणार्थ @SuppressWarnings({"अनचेक", "cast"}) .
public class DocumentsFolder {
   private List documents;

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

या उदाहरणात, आम्ही परिभाषित प्रकार (सामान्य प्रकार) नसलेल्या सूचीमध्ये जोडण्याचा प्रयत्न करीत आहोत. कंपाइलर आम्हाला याबद्दल चेतावणी देईल. हे खूप उपयुक्त आहे, परंतु कधीकधी बर्याच "इशारे" असतात आणि ते गोंगाट करणारे असू शकतात. तुम्ही ही पद्धत भाष्य वापरू शकता आणि वितर्क म्हणून कंपाइलर चेतावणीचा प्रकार निर्दिष्ट करू शकता. तेथे बरेच मार्कर आहेत, म्हणून ते सर्व लक्षात ठेवण्याची काळजी करू नका — IDEA सहसा तुम्हाला कोणते जोडायचे ते सांगेल.

एकाधिक वितर्कांसह दुसरे उदाहरण:

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