"এখন আসুন কয়েকটি টীকা তৈরি করি এবং ব্যবহার করি।"

"উদাহরণস্বরূপ, ধরা যাক আমরা একটি গেম ইঞ্জিন লিখছি। আমাদের গেমটিতে অনেকগুলি চরিত্র রয়েছে যা তিনটি বিভাগে পড়ে: এলভস, প্যালেস গার্ড এবং ভিলেন।"

"গেমটি তৈরি হওয়ার সাথে সাথে নতুন অক্ষর যোগ করা হতে পারে, এবং এটি গেমের ভারসাম্যকে পরিবর্তন করবে। এইভাবে, প্রতিটি 'ক্যারেক্টার ক্লাস' এর নিজস্ব টীকা বরাদ্দ করা খুব সুবিধাজনক হবে যা এর শারীরিক বৈশিষ্ট্য বর্ণনা করে।"

"এটি করার ফলে বিভিন্ন চরিত্রের মধ্যে লড়াই এবং/অথবা দ্রুত গেমের ভারসাম্য গণনা করা খুব সহজ হবে।"

"আমি রাজি। এটা একটা ভালো ধারণা।"

"আসুন একটি @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 টীকা নির্দেশ করে যে আমাদের টীকাটি কোথায় দৃশ্যমান হবে: শুধুমাত্র সোর্স কোডে, এমনকি সংকলনের পরেও, এমনকি রান টাইমেও।"

"@টার্গেট টীকাটি নির্দেশ করে যে বিশেষভাবে টীকা ব্যবহার করে কী চিহ্নিত করা যেতে পারে: ক্লাস, ক্ষেত্র, পদ্ধতি, পদ্ধতির পরামিতি ইত্যাদি।"

"যদি আমরা চাই যে আমাদের টীকাটি এমন ক্লাসগুলিতে প্রয়োগ করা হোক যা একটি টীকা শ্রেণীকে উত্তরাধিকারী করে এবং কেবলমাত্র টীকা শ্রেণীতে নয়, তাহলে আমাদের এটিকে @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();
}

"এটি খুব আকর্ষণীয় ছিল, ধন্যবাদ, ঋষি।"

কিন্তু কিভাবে আপনি প্রোগ্রামে এই টীকা দিয়ে কাজ করবেন? তুমি কিভাবে ওগুলি ব্যবহার করবে? আপনি কিভাবে তাদের মান পড়েন?"

"এটি সাধারণত প্রতিফলন ব্যবহার করে করা হয় ।"

"এখানে আমরা কীভাবে নির্ধারণ করব কোন চরিত্রটি শক্তিশালী:"

উদাহরণ
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 পদ্ধতিতে কল করুন।"

"আজকের জন্য এটাই।"

"ধন্যবাদ, ঋষি। এটি একটি খুব আকর্ষণীয় পাঠ ছিল। এখন আমি পানির মতো টীকাকে ভয় পাই না।"