「それでは、いくつかの注釈を作成して使用してみましょう。」

「たとえば、ゲーム エンジンを作成しているとします。私たちのゲームには、エルフ、宮殿の衛兵、悪役の 3 つのカテゴリに分類されるキャラクターがたくさんいます。」

「ゲームが開発されるにつれて、新しいキャラクターが追加される可能性があり、これによりゲームバランスが変化します。したがって、各「キャラクタークラス」に、その物理的特徴を説明する独自の注釈を割り当てると非常に便利です。」

「そうすることで、異なるキャラクター間の戦闘をシミュレートしたり、ゲームバランスを迅速に計算したりすることが非常に簡単になります。」

「同意します。それは良い考えですね。」

「ライフ、体力、魔法、攻撃パラメータ、防御パラメータを保存する@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
{
 …
}

「なるほど。ちょっとマーカーインターフェイスを思い出しますね。」

「はい。ただし、第一に、何も継承する必要はありません。そして第二に、追加情報を注釈に保存できます。」

"注釈をマークするために使用される注釈がさらにいくつかあります。それらは次のとおりです。 "

「@Retention アノテーションは、アノテーションが表示される場所を示します。ソース コード内のみ、コンパイル後、実行時でも表示されます。」

「@Target アノテーションは、クラス、フィールド、メソッド、メソッド パラメーターなど、アノテーションを使用して具体的にマークできるものを示します。」

「注釈を付けたクラス自体だけでなく、注釈を付けたクラスを継承するクラスにも注釈を適用したい場合は、 @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();
}

「とても面白かったです、ありがとう、リシ。」

しかし、プログラム内でこれらの注釈をどのように操作するのでしょうか? どうやって使うのですか?彼らの価値観をどう読みますか?」

「これは通常、Reflection を使用して行われます。」

「どのキャラクターが強いかを判断する方法は次のとおりです。」

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 メソッドを呼び出して、必要な注釈タイプを渡すだけです。」

「今日はここまでです。」

「ありがとう、リシ。とても興味深いレッスンでした。今では水を怖がるのと同じように注釈を恐れなくなりました。」