"Most hozzunk létre és használjunk fel néhány megjegyzést."

"Például tegyük fel, hogy játékmotort írunk. A játékunkban rengeteg karakter van, amelyek három kategóriába sorolhatók: elfek, palotaőrök és gazemberek."

"A játék fejlesztése során új karakterek kerülhetnek hozzá, és ez megváltoztatja a játék egyensúlyát. Így nagyon kényelmes lenne minden "karakterosztályhoz" hozzárendelni egy saját megjegyzést, amely leírja a fizikai jellemzőit."

"Ezzel nagyon egyszerűvé válna a különböző karakterek közötti csaták szimulálása és/vagy a játékegyenleg gyors kiszámítása."

– Egyetértek. Ez jó ötlet.

"Hozzon létre egy @Person annotációt, amely életet, erőt és varázslatot, valamint támadási és védekezési paramétereket tárol. Így néz ki a kommentár:"

Példa
@interface Person
{
 String name() default "";
 int live();
 int strength();
 int magic() default 0;
 int attack() default 0;
 int defense();
}

"És például íme, hogyan nézne ki egy erdei elf mágus leírása:

Példa
@Person(live = 100, strength = 10, magic = 5, attack = 20, defense = 20)
class Elf
{
 …
}

"És így nézne ki a főgonosz leírása:"

Példa
@Person(live = 1000, strength = 150, magic = 250, attack = 99, defense = 99)
class EvilMaster
{
 …
}

"Értem. Kicsit a jelölőfelületekre emlékeztet."

"Igen. Kivéve, először is, nem kell örökölnie semmit. Másodszor, további információkat tárolhat a megjegyzésekben."

"Van néhány további megjegyzés a kommentárok megjelölésére. Itt vannak: "

"A @Retention annotáció jelzi, hogy a megjegyzésünk hol lesz látható: csak a forráskódban, még a fordítás után is, vagy akár futási időben."

"A @Target annotáció azt jelzi, hogy konkrétan mi jelölhető meg az annotációval: osztályok, mezők, metódusok, metódusparaméterek stb."

"Ha azt akarjuk, hogy az annotációnkat azokra az osztályokra alkalmazzuk, amelyek egy annotált osztályt örökölnek, és ne csak magára a kommentált osztályra, akkor az @Inherited-el kell kommentálnunk."

"Így nézne ki a @Személy. megjegyzésünk."

Példa
@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();
}

– Nagyon érdekes volt, köszönöm, Rishi.

De hogyan lehet ezekkel a megjegyzésekkel dolgozni a programban? Hogyan használod őket? Hogyan olvasod az értékeiket?"

"Ez általában a Reflection segítségével történik ."

"Így határozzuk meg, melyik karakter erősebb:"

Példa
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;
}

"Íme a módszerek, amelyekre szükségünk van:"

Mód Leírás
isAnnotationPresent(Annotation.class)
Ellenőrzi, hogy az osztály rendelkezik-e a megadott megjegyzéssel
getAnnotation(Annotation.class)
Annotáció objektumot ad vissza, ha az osztály rendelkezik a megadott megjegyzéssel.
Annotation[] getAnnotations()
Az osztály összes megjegyzésének tömbjét adja vissza

"Remek. Nem gondoltam volna, hogy ilyen egyszerű lesz egy kommentár megszerzése."

"UH Huh." Egyszerűen hívja meg az objektum getAnnotation metódusát, és adja át a kívánt megjegyzéstípust."

– Mára ennyi.

"Köszönöm, Rishi. Ez egy nagyon érdekes lecke volt. Most már nem félek a megjegyzésektől, mint a víztől."