"Şimdi birkaç açıklama oluşturup kullanalım."

"Örneğin, bir oyun motoru yazdığımızı varsayalım. Oyunumuzda üç kategoriye ayrılan birçok karakter var: elfler, saray muhafızları ve kötüler."

"Oyun geliştirildikçe yeni karakterler eklenebilir ve bu oyun dengesini değiştirir. Bu nedenle, her 'karakter sınıfına' fiziksel özelliklerini açıklayan kendi açıklamasını atamak çok uygun olur."

"Bunu yapmak, farklı karakterler arasındaki savaşları simüle etmeyi ve/veya oyun dengesini hızlı bir şekilde hesaplamayı çok kolaylaştıracaktır."

"Katılıyorum. Bu iyi bir fikir."

" Yaşam, güç ve sihrin yanı sıra saldırı ve savunma parametrelerini depolayacak bir @Person ek açıklaması oluşturalım . Ek açıklama şu şekilde görünüyor:"

Örnek
@interface Person
{
 String name() default "";
 int live();
 int strength();
 int magic() default 0;
 int attack() default 0;
 int defense();
}

"Ve örnek olarak, bir orman elf büyücüsünün tanımı şu şekilde olur:"

Örnek
@Person(live = 100, strength = 10, magic = 5, attack = 20, defense = 20)
class Elf
{}

"Ve ana kötü karakterin açıklaması şöyle görünürdü:"

Örnek
@Person(live = 1000, strength = 150, magic = 250, attack = 99, defense = 99)
class EvilMaster
{}

"Anlıyorum. Bana biraz işaretçi arayüzlerini hatırlattı."

"Evet. Ancak, ilk olarak, hiçbir şeyi miras almanız gerekmez. İkincisi, ek açıklamalarda ek bilgiler depolayabilirsiniz."

"Açıklamaları işaretlemek için kullanılan birkaç ek açıklama daha var . İşte bunlar: "

"@Retention ek açıklaması, ek açıklamamızın nerede görüneceğini gösterir: yalnızca kaynak kodunda, hatta derlemeden sonra ve hatta çalışma zamanında."

"@Target ek açıklaması, ek açıklama kullanılarak özellikle neyin işaretlenebileceğini gösterir: sınıflar, alanlar, yöntemler, yöntem parametreleri, vb."

"Açıklamamızın yalnızca açıklamalı sınıfın kendisine değil, açıklamalı bir sınıfı miras alan sınıflara uygulanmasını istiyorsak, o zaman @Inherited ile açıklama eklememiz gerekir."

" @Person. ek açıklamamız böyle görünürdü ."

Örnek
@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();
}

"Bu çok ilginçti, teşekkürler Rishi."

Ancak programdaki bu ek açıklamalarla nasıl çalışıyorsunuz? Onları nasıl kullanıyorsunuz? Değerlerini nasıl okuyorsunuz?”

"Bu genellikle Reflection kullanılarak yapılır ."

"Hangi karakterin daha güçlü olduğunu şu şekilde belirleyeceğiz:"

Örnek
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;
}

"İşte ihtiyacımız olan yöntemler:"

Yöntemler Tanım
isAnnotationPresent(Annotation.class)
Sınıfın belirtilen ek açıklamaya sahip olup olmadığını kontrol eder
getAnnotation(Annotation.class)
Sınıf belirtilen ek açıklamaya sahipse, bir ek açıklama nesnesi döndürür.
Annotation[] getAnnotations()
Sınıfın tüm ek açıklamalarının bir dizisini döndürür

"Harika. Ek açıklama almanın bu kadar kolay olacağını beklemiyordum."

"HI-hı." İstenen ek açıklama türünü ileterek nesnenin getAnnotation yöntemini çağırmanız yeterlidir."

"Bugünlük bu kadar."

"Teşekkürler Rishi. Bu çok ilginç bir dersti. Artık sudan korktuğum kadar notlardan korkmuyorum."