JavaRush /Kurslar /All lectures for UZ purposes /Annotatsiyalar, qanday yaratish

Annotatsiyalar, qanday yaratish

All lectures for UZ purposes
Daraja, Dars
Mavjud

— Shunday qilib, keling hozir bir-ikki annotatsiya yarataylik va ularni ishlataylik.

Masalan, biz o'yin uchun dvigatel yozmoqdamiz. Shu bilan birga o'yinimizda juda ko'p personajlar bor, ular uchta toifaga bo'linadi: elflar, saroy qo'riqchilari va yovuzlar.

O'yinni ishlab chiqish jarayonida yangi personajlar qo'shilishi mumkin va shu bilan birga o'yin balansini o'zgartirishi mumkin. Shu sababli har bir “personaj klassiga” o'zining fizik xususiyatlarini ifodalovchi annotatsiya qo'shish juda qo'l keladi.

Shunda turli personajlar orasida janglarni juda oson simulyatsiya qilish va/yoki o'yin balansini tezda hisoblash mumkin bo'ladi.

— Ma'qul – yaxshi fikr.

— Keling, @Person annotatsiyasini yarataylik, unda: hayot, kuch, sehr, shuningdek, hujum va himoya parametrlarini saqlaymiz. Mana, bu annotatsiya qanday ko'rinadi:

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

Mana, masalan, o'rmon elflari-sehrgarning ta'rifi qanday ko'rinardi:

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

Mana, asosiy yovuz odamning ta'rifi qanday ko'rinardi:

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

— Tushunarli. Bular interfeys-markerlarni eslatyapti.

— Ha, lekin, birinchidan, hech narsa meros olishning hojati yo'q, ikkinchidan, annotatsiyalarda qo'shimcha ma'lumot saqlash mumkin.

Annotatsiyalar belgilangan bir nechta annotatsiyalar bor. Mana ular:

Annotatsiya @Retention annotatsiyani qayerda ko'rish mumkinligini ko'rsatadi: faqat dastlabki kodda, kompilatsiyadan keyin ham mavjud, hatto dastur bajarish vaqtida ham mavjud bo'ladi.

Annotatsiya @Target bu annotatsiya bilan aynan nimani belgilash mumkinligini ko'rsatadi: klass, maydon, metod, metod parametri va hokazo.

Agar bizning annotatsiyamiz faqat u bilan belgilanmagan klassga emas, balki uning merosxo'rlarida ham ishlashini istasak, uni @Inherited bilan belgilash kerak.

Mana, bizning @Person annotatsiyamiz qanday ko'rinishga ega bo'ladi.

Misol
@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 defense();
}

— Bu juda qiziqarli edi, rahmat, Risha.

Ushbu annotatsiyalar bilan dasturda qanday ishlash kerak? Ularni qanday ishlatish mumkin? Ularning qiymatlarini qanday o'qish mumkin?

— Buning uchun Reflection dan foydalaniladi.

Mana, qaysi personaj kuchliroq ekanligini aniqlash qanday ko'rinishga ega bo'lardi:

Misol
public boolean fight(Class first, Class second)
{
 if (!first.isAnnotationPresent(Person.class))
  throw new RuntimeException("birinchi parametr o'yin personaji emas");
 if (!second.isAnnotationPresent(Person.class))
  throw new RuntimeException("ikkinchi parametr o'yin personaji emas");

 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.defense() * firstAttack;

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

 return firstPower > secondPower;
}

Mana bizga kerak bo'lgan klass metodlari:

Metodlar Ta'rifi
isAnnotationPresent(Annotation.class)
Klassda kerakli annotatsiya bor yoki yo'qligini tekshiradi
getAnnotation(Annotation.class)
Agar klassda mavjud bo'lsa, annotatsiya obyektivni qaytaradi.
Annotation[] getAnnotations()
Klassning barcha annotatsiyalarini massivda qaytaradi

— Juda yaxshi. Men annotatsiyani olish shunchalik oson ekanligini o'ylamagan edim.

— Ha. Shunchaki klass obyektida getAnnotation metodini chaqirdim va kerakli annotatsiya turini u yerga berdim.

Bugun uchun shu bilan tugadi.

— Rahmat, Risha, bu juda qiziqarli leksiya edi. Va endi men annotatsiyalardan suv kabi qo'rqmayman.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION