"आता काही भाष्ये बनवू आणि वापरू."

"उदाहरणार्थ, समजा की आम्ही गेम इंजिन लिहित आहोत. आमच्या गेममध्ये बरीच पात्रे आहेत जी तीन श्रेणींमध्ये येतात: एल्व्ह, पॅलेस गार्ड आणि खलनायक."

"जसा गेम विकसित होईल, नवीन वर्ण जोडले जातील, आणि यामुळे गेमचे संतुलन बदलेल. अशा प्रकारे, प्रत्येक 'कॅरेक्टर क्लास'ला त्याच्या भौतिक वैशिष्ट्यांचे वर्णन करणारे स्वतःचे भाष्य नियुक्त करणे खूप सोयीचे असेल."

"असे केल्याने वेगवेगळ्या पात्रांमधील लढाया आणि/किंवा गेम बॅलन्सची त्वरीत गणना करणे खूप सोपे होईल."

"मी सहमत आहे. ही चांगली कल्पना आहे."

"चला एक @Person भाष्य तयार करू जे जीवन, सामर्थ्य आणि जादू, तसेच आक्रमण आणि संरक्षण पॅरामीटर्स संग्रहित करेल. भाष्य कसे दिसते ते येथे आहे:"

उदाहरण
@interface Person
{
 String name() default "";
 int live();
 int strength();
 int magic() default 0;
 int attack() default 0;
 int defense();
}

"आणि, एक उदाहरण म्हणून, फॉरेस्ट एल्फ मॅजचे वर्णन कसे दिसेल ते येथे आहे:"

उदाहरण
@Person(live = 100, strength = 10, magic = 5, attack = 20, defense = 20)
class Elf
{}

"आणि मुख्य खलनायकाचे वर्णन कसे दिसेल ते येथे आहे:"

उदाहरण
@Person(live = 1000, strength = 150, magic = 250, attack = 99, defense = 99)
class EvilMaster
{}

"मी पाहतो. हे मला मार्कर इंटरफेसची थोडी आठवण करून देते."

"होय. वगळता, प्रथम, तुम्हाला काहीही वारसा मिळण्याची गरज नाही. आणि दुसरे, तुम्ही भाष्यांमध्ये अतिरिक्त माहिती साठवू शकता."

" भाष्य चिन्हांकित करण्यासाठी आणखी काही भाष्ये आहेत . ती येथे आहेत: "

"@रिटेन्शन भाष्य सूचित करते की आमची भाष्य कोठे दृश्यमान असेल: केवळ स्त्रोत कोडमध्ये, संकलनानंतर किंवा रन टाइममध्ये देखील."

"@लक्ष्य भाष्य हे सूचित करते की भाष्य वापरून काय चिन्हांकित केले जाऊ शकते: वर्ग, फील्ड, पद्धती, पद्धत पॅरामीटर्स इ."

"आम्हाला आमची भाष्ये केवळ भाष्य वर्गालाच नव्हे तर केवळ भाष्य केलेल्या वर्गालाच वारशाने मिळणाऱ्या वर्गांवर लागू करायची असतील, तर आम्हाला @Inherited सह भाष्य करणे आवश्यक आहे."

"हे आमचे @Person. भाष्य असे दिसेल."

उदाहरण
@Target(value = ElementType.TYPE)
@Retention(value = RetentionPolicy.RUNTIME)
@interface Person
{
 String name() default "";
 int live();
 int strength();
 int magic() default 0;
 int attack() default 0;
 int defence();
}

"ते खूप मनोरंजक होते, धन्यवाद, ऋषी."

परंतु प्रोग्राममधील या भाष्यांसह आपण कसे कार्य कराल? तुम्ही त्यांचा वापर कसा करता? तुम्ही त्यांची मूल्ये कशी वाचता?"

"हे सामान्यतः रिफ्लेक्शन वापरून केले जाते ."

"कोणते पात्र अधिक मजबूत आहे हे आम्ही कसे ठरवू ते येथे आहे:"

उदाहरण
public boolean fight(Class first, Class second)
{
 if (!first.isAnnotationPresent(Person.class))
  throw new RuntimeException("first param is not game person");
 if (!second.isAnnotationPresent(Person.class))
  throw new RuntimeException("second param is not game person");

 Person firstPerson = (Person) first.getAnnotation(Person.class);
 Person secondPerson = (Person) second.getAnnotation(Person.class);

 int firstAttack = firstPerson.attack() * firstPerson.strength() + firstPerson.magic();
 int firstPower = firstPerson.live() * firstPerson.defence() * firstAttack;

 int secondAttack = secondPerson.attack() * secondPerson.strength() + secondPerson.magic();
 int secondPower = secondPerson.live() * secondPerson.defence() * secondAttack;

 return firstPower > secondPower;
}

"आम्हाला आवश्यक असलेल्या पद्धती येथे आहेत:"

पद्धती वर्णन
isAnnotationPresent(Annotation.class)
वर्गात निर्दिष्ट भाष्य आहे का ते तपासते
getAnnotation(Annotation.class)
क्लासमध्ये निर्दिष्ट भाष्य असल्यास भाष्य ऑब्जेक्ट मिळवते.
Annotation[] getAnnotations()
वर्गाच्या सर्व भाष्यांचा अ‍ॅरे मिळवते

"छान. मला भाष्य मिळणे इतके सोपे असेल अशी अपेक्षा नव्हती."

"उह-हह." इच्छित भाष्य प्रकारात उत्तीर्ण होऊन, फक्त ऑब्जेक्टच्या getAnnotation पद्धतीला कॉल करा."

"आजसाठी एवढेच."

"धन्यवाद, ऋषी. हा एक अतिशय मनोरंजक धडा होता. आता मी पाण्याप्रमाणे भाष्य करण्यास घाबरत नाही."