"Bây giờ hãy tạo và sử dụng một vài chú thích."

"Ví dụ, giả sử chúng tôi đang viết một công cụ trò chơi. Trò chơi của chúng tôi có rất nhiều nhân vật thuộc ba loại: yêu tinh, lính canh cung điện và nhân vật phản diện."

"Khi trò chơi được phát triển, các nhân vật mới có thể được thêm vào và điều này sẽ làm thay đổi sự cân bằng của trò chơi. Do đó, sẽ rất thuận tiện nếu gán cho mỗi 'lớp nhân vật' chú thích riêng mô tả các đặc điểm ngoại hình của nó."

"Làm như vậy sẽ giúp dễ dàng mô phỏng các trận chiến giữa các nhân vật khác nhau và/hoặc nhanh chóng tính toán số dư trò chơi."

"Tôi đồng ý. Đó là một ý tưởng tốt."

"Hãy tạo một chú thích @Person sẽ lưu trữ sự sống, sức mạnh và phép thuật, cũng như các thông số tấn công và phòng thủ. Đây là giao diện của chú thích:"

Ví dụ
@interface Person
{
 String name() default "";
 int live();
 int strength();
 int magic() default 0;
 int attack() default 0;
 int defense();
}

"Và, ví dụ, đây là mô tả của một pháp sư yêu tinh trong rừng sẽ như thế nào:"

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

"Và đây là mô tả về nhân vật phản diện chính sẽ như thế nào:"

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

"Tôi hiểu rồi. Nó gợi cho tôi một chút về giao diện đánh dấu."

"Có. Ngoại trừ, thứ nhất, bạn không phải kế thừa bất cứ thứ gì. Và thứ hai, bạn có thể lưu trữ thông tin bổ sung trong các chú thích."

"Có một vài chú thích khác được sử dụng để đánh dấu các chú thích. Đây là: "

"Chú thích @Retention cho biết nơi chú thích của chúng tôi sẽ hiển thị: chỉ trong mã nguồn, ngay cả sau khi biên dịch hoặc thậm chí trong thời gian chạy."

"Chú thích @Target cho biết những gì cụ thể có thể được đánh dấu bằng cách sử dụng chú thích: lớp, trường, phương thức, tham số phương thức, v.v."

"Nếu chúng ta muốn chú thích của mình được áp dụng cho các lớp kế thừa một lớp được chú thích chứ không chỉ cho chính lớp được chú thích, thì chúng ta cần chú thích nó bằng @Inherited."

"Đây là hình thức chú thích @Person. của chúng ta."

Ví dụ
@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();
}

"Điều đó rất thú vị, cảm ơn, Rishi."

Nhưng làm thế nào để bạn làm việc với những chú thích này trong chương trình? Làm thế nào để bạn sử dụng chúng? Làm thế nào để bạn đọc các giá trị của họ?"

"Điều này thường được thực hiện bằng cách sử dụng Reflection ."

"Đây là cách chúng tôi xác định nhân vật nào mạnh hơn:"

Ví dụ
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;
}

"Đây là các phương pháp mà chúng ta cần:"

phương pháp Sự miêu tả
isAnnotationPresent(Annotation.class)
Kiểm tra xem lớp có chú thích được chỉ định hay không
getAnnotation(Annotation.class)
Trả về một đối tượng chú thích nếu lớp có chú thích được chỉ định.
Annotation[] getAnnotations()
Trả về một mảng tất cả các chú thích của lớp

"Tuyệt. Tôi không ngờ việc nhận được chú thích lại đơn giản như vậy."

"Uh-huh." Chỉ cần gọi phương thức getAnnotation của đối tượng, chuyển vào loại chú thích mong muốn."

"Điều này là dành cho hôm nay."

"Cảm ơn, Rishi. Đây là một bài học rất thú vị. Bây giờ tôi không sợ chú thích như tôi sợ nước."