Lợi ích chính của các chú thích không đến từ việc sử dụng các chú thích tiêu chuẩn đã có trong JDK. Đồng thời, hiếm khi cần phải tạo chú thích của riêng bạn. Nhưng nếu chúng ta đang phát triển một hệ thống lớn hoặc tạo một thư viện riêng biệt, thì ở cấp độ kiến ​​trúc, việc triển khai chú thích của riêng chúng ta chắc chắn sẽ mang lại lợi nhuận.

Hãy thử tạo một chú thích.

Để làm điều này, hãy tạo một tệp, nhưng thay vì viết lớp hoặc giao diện , hãy viết @interface . Đây sẽ là tập tin cho chú thích của chúng tôi. Cấu trúc bên trong của một chú thích tương tự như cấu trúc của một giao diện.

public @interface Sum {
   int sum() default 0;
}

@interface chỉ ra rằng đây là một chú thích,
mặc định nói rằng tham số sẽ có một giá trị mặc định cụ thể.

Ta-da! Chúng tôi đã tạo một chú thích! Về mặt lý thuyết, chúng ta có thể sử dụng nó rồi, nhưng trước tiên, sẽ tốt hơn nếu cấu hình nó.

Nếu không có cấu hình, chú thích của chúng ta có thể được áp dụng cho bất kỳ thứ gì (cho các lớp, phương thức, thuộc tính, v.v.), vì vậy sẽ không có ý nghĩa gì khi sử dụng nó vào thời điểm này. Có vẻ lạ, chú thích của chúng ta cần được chú thích với các chú thích khác!

Hãy bắt đầu với @Target .

Chú thích @Target (có liên quan kể từ Java 1.5) hạn chế khả năng áp dụng chú thích. Để giới hạn việc sử dụng ở một mức độ nhất định, chúng ta cần truyền một đối số cho chú thích @Target để cho biết nó có thể được áp dụng cho những loại nào. Dưới đây là một số loại thường được sử dụng:

@Target(ElementType.PACKAGE) cho các gói
@Target(ElementType.TYPE) cho các lớp học
@Target(ElementType.CONSTRUCTOR) cho các nhà xây dựng
@Target(ElementType.METHOD) cho các phương pháp
@Target(ElementType.FIELD) cho các thuộc tính (biến) trong một lớp
@Target(ElementType.PARAMATER) cho các tham số phương pháp
@Target(ElementType.LOCAL_VARIABLE) cho các biến cục bộ

Nếu bạn cần chú thích cho một số loại, thì bạn có thể chuyển một số đối số dưới dạng một mảng:

@Target({ ElementType.PARAMETER, ElementType.LOCAL_VARIABLE })

Phần quan trọng tiếp theo của cấu hình là chú thích @Retention .

Chú thích này cho biết các phần của vòng đời mã trong đó chú thích của chúng tôi sẽ có sẵn:

RetentionPolicy.SOURCE Các chú thích được đánh dấu bằng chính sách lưu giữ NGUỒN sẽ bị loại bỏ trong thời gian chạy.
RetentionPolicy.CLASS Các chú thích được đánh dấu bằng chính sách lưu giữ LỚP được ghi vào tệp .class , nhưng sẽ bị xóa khi chạy.
RetentionPolicy.RUNTIME Các chú thích được đánh dấu bằng chính sách lưu giữ RUNTIME vẫn tồn tại trong thời gian chạy và có thể được truy cập trong chương trình của chúng tôi khi chạy.

Có một vài chú thích khác mà bạn có thể sử dụng để cấu hình:

Chú thích Giá trị
@Thừa hưởng Chỉ ra rằng một lớp dẫn xuất kế thừa việc triển khai chú thích của lớp cha.
@Tài liệu Điều này chỉ ra rằng chú thích sẽ được đưa vào tài liệu Javadoc đã tạo.

Bây giờ, hãy thử tạo chú thích của riêng chúng ta.

Chúng tôi sẽ tạo một chú thích dành cho các lớp và phương thức và chứa thông tin về tác giả và phiên bản của mã:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Info {
   String author() default "Author";
   String version() default "0.0";
}

Chúng ta có thể áp dụng chú thích của mình cho các phương thức và lớp. Siêu dữ liệu của chú thích của chúng tôi sẽ có sẵn trong thời gian chạy. Hãy chú ý đến các tham số của chú thích của chúng tôi: Chúng tôi có thể cung cấp hai đối số (tác giả và phiên bản) hoặc chúng tôi có thể bỏ qua chúng. Nếu chúng tôi bỏ qua chúng, thì các giá trị mặc định đã chỉ định ( "Tác giả" mặc định"0.0" mặc định ) sẽ được sử dụng.

Điều đáng chú ý là chúng ta không phải chỉ định giá trị mặc định cho các tham số. Trong trường hợp này, tham số trở thành bắt buộc.

Khi truyền đối số, chúng ta phải chỉ định tham số tương ứng bằng cách sử dụng ký hiệu value = "value" . Tham số phải luôn được đặt tên rõ ràng, ngay cả khi chú thích có một tham số duy nhất.

Hãy áp dụng chú thích của chúng tôi cho một vài lớp:

@Info
public class MyClass1 {
   @Info
   public void myClassMethod() {}
}

@Info(version = "2.0")
public class MyClass2 {
   @Info(author = "Anonymous")
   public void myClassMethod() {}
}

@Info(author = "Anonymous", version = "2.0")
public class MyClass3 {
   @Info(author = "Anonymous", version = "4.0")
   public void myClassMethod() {}
}