Vào năm 2005, với sự xuất hiện của Java 5, chúng ta đã biết đến các thực thể mới được gọi là chú thích.
Chú thích là một dạng đặc biệt của siêu dữ liệu cú pháp có thể được khai báo trong mã. Chúng được sử dụng để phân tích mã khi biên dịch hoặc khi chạy. Bạn có thể coi chú thích là nhãn, thẻ hoặc gợi ý trình biên dịch.
Bạn có thể đã bắt gặp các chú thích trước đây. Ví dụ: khi ghi đè một phương thức của lớp cha, chúng ta viết @Override trước chính phương thức đó. Chú thích này chỉ ra rằng phương thức của cha mẹ sẽ được ghi đè trong lớp con.
Cú pháp:
@Override
public int hashCode() {
return super.hashCode();
}
Tôi muốn lưu ý ngay rằng các chú thích không chỉ áp dụng cho các phương thức. Chúng được sử dụng với các gói, lớp, phương thức, trường và tham số.
Để hiểu cách hoạt động của chú thích, trước tiên chúng ta hãy làm quen với khái niệm về giao diện điểm đánh dấu. Kể từ khi Java ra đời, các nhà phát triển luôn cần một cách để đánh dấu các lớp để thực hiện một số hành động nhất định trên chúng.
Trước Java 5, họ đã sử dụng một giao diện không thực hiện được những gì chúng ta mong đợi các giao diện sẽ thực hiện. Nó không có phương pháp và không có hợp đồng. Nó chỉ đánh dấu một lớp là đặc biệt theo một cách nào đó.
Giao diện như vậy được gọi là giao diện đánh dấu. Từ cái tên, bạn có thể đoán rằng mục đích của nó là đánh dấu các lớp cho JVM, trình biên dịch hoặc thư viện nào đó. Một số giao diện đánh dấu, chẳng hạn như Serializable , vẫn còn. Giao diện đánh dấu này cho phép chúng tôi chỉ ra rằng các thể hiện của một lớp có thể được đánh số thứ tự.
Như chúng ta đã thấy, các giao diện đánh dấu tiếp tục tồn tại ngay cả sau khi giới thiệu các chú thích.
Chú thích so với giao diện đánh dấu:
@MyAnnotation
public class MyClass {}
public class MyClass implements MarkerInterface {}
Cả hai cách tiếp cận đều có cùng một mục tiêu, nhưng có sự khác biệt rõ ràng trong việc thực hiện chúng. Ví dụ, hãy xem xét một giao diện và một chú thích chỉ ra rằng một lớp thuộc về một loại cụ thể.
Nếu chúng tôi đang sử dụng một giao diện, thì chúng tôi đánh dấu lớp. Nếu chúng ta sử dụng không đúng và xảy ra lỗi, thì chúng ta sẽ phát hiện ra vấn đề trong quá trình biên dịch và chương trình sẽ không chạy được.
Với chú thích, mọi thứ không đơn giản như vậy: ở đây lỗi sẽ được phát hiện trong thời gian chạy, điều đó có nghĩa là chương trình sẽ bắt đầu, nhưng không có gì ngạc nhiên khi chương trình sẽ không kết thúc.
Lưu ý rằng nếu chúng ta cần đánh dấu một lớp để sử dụng trong tương lai, thì các thể hiện của nó phải được chuyển đến một phương thức cụ thể:
public class MyInteger implements Sum {}
interface Sum {};
public static void main(String[] args) throws IOException {
increase(new MyInteger());
}
public static void increase(Sum count) {
// TODO
}
Một giao diện đánh dấu hoạt động tốt nhất ở đây.
Tốt nhất là sử dụng chú thích khi chúng ta cần thêm thứ gì đó, chẳng hạn như các tham số mà chú thích hỗ trợ.
Hãy xem các chú thích tiêu chuẩn trong JDK:
Chú thích | Sự miêu tả | Ví dụ |
---|---|---|
@Ghi đè | Chỉ định rằng một phương thức ghi đè phương thức của lớp cha hoặc triển khai phương thức của lớp trừu tượng hoặc giao diện. |
|
@Không dùng nữa | Đánh dấu mã là không dùng nữa. |
|
@SuppressWarnings | Vô hiệu hóa các cảnh báo của trình biên dịch cho phần tử được chú thích. Lưu ý rằng nếu bạn cần tắt nhiều danh mục cảnh báo, chúng phải được đặt trong dấu ngoặc nhọn, ví dụ @SuppressWarnings({"unchecked", "cast"}) . |
Trong ví dụ này, chúng tôi đang cố gắng thêm vào danh sách không có loại xác định (loại chung). Trình biên dịch sẽ cảnh báo chúng ta về điều này. Điều này rất hữu ích, nhưng đôi khi có quá nhiều "cảnh báo" và chúng có thể gây ồn ào. Bạn có thể sử dụng chú thích phương thức này và chỉ định một loại cảnh báo trình biên dịch làm đối số. Có rất nhiều điểm đánh dấu, vì vậy đừng lo lắng về việc ghi nhớ tất cả — IDEA thường sẽ cho bạn biết nên thêm điểm đánh dấu nào. Một ví dụ khác với nhiều đối số:
|
GO TO FULL VERSION