"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:"
@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:
@Person(live = 100, strength = 10, magic = 5, attack = 20, defense = 20)
class Elf
{
…
}
"És így nézne ki a főgonosz leírása:"
@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."
@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:"
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 |
---|---|
|
Ellenőrzi, hogy az osztály rendelkezik-e a megadott megjegyzéssel |
|
Annotáció objektumot ad vissza, ha az osztály rendelkezik a megadott megjegyzéssel. |
|
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."
GO TO FULL VERSION