Trong hướng dẫn này, chúng ta sẽ tìm hiểu về các loại chú thích Java khác nhau với sự trợ giúp của các ví dụ.
Chú thích Java là siêu dữ liệu (dữ liệu về dữ liệu) cho mã nguồn chương trình của chúng tôi. Có một số chú thích được xác định trước được cung cấp bởi Java SE. Hơn nữa, chúng tôi cũng có thể tạo các chú thích tùy chỉnh theo nhu cầu của chúng tôi.
Nếu bạn không biết chú thích là gì, hãy truy cập hướng dẫn chú thích Java .
Các chú thích này có thể được phân loại thành:
1. Chú thích được xác định trước
@Deprecated
@Override
@SuppressWarnings
@SafeVarargs
@FunctionalInterface
2. Chú thích tùy chỉnh
3. Chú thích meta
@Retention
@Documented
@Target
@Inherited
@Repeatable
Các loại chú thích được xác định trước
1. @Deprecated
Các @Deprecated
chú thích là một chú thích đánh dấu cho biết các phần tử (lớp, phương pháp, lĩnh vực, vv) bị phản đối và đã được thay thế bởi một yếu tố mới.
Cú pháp của nó là:
@Deprecated
accessModifier returnType deprecatedMethodName() { ... }
Khi một chương trình sử dụng phần tử đã được khai báo không được chấp nhận, trình biên dịch sẽ tạo ra một cảnh báo.
Chúng tôi sử dụng @deprecated
thẻ Javadoc để ghi lại phần tử không dùng nữa.
/**
* @deprecated
* why it was deprecated
*/
@Deprecated
accessModifier returnType deprecatedMethodName() { ... }
Ví dụ 1: Ví dụ về chú thích @Deprecated
class Main {
/**
* @deprecated
* This method is deprecated and has been replaced by newMethod()
*/
@Deprecated
public static void deprecatedMethod() {
System.out.println("Deprecated method");
}
public static void main(String args[]) {
deprecatedMethod();
}
}
Đầu ra
Deprecated method
2. @Override
Các @Override
quy định cụ thể chú thích rằng một phương pháp của một lớp con override phương thức của lớp cha có cùng tên phương pháp, kiểu trả về, và danh sách tham số.
Nó không bắt buộc phải sử dụng @Override
khi ghi đè một phương thức. Tuy nhiên, nếu chúng ta sử dụng nó, trình biên dịch sẽ báo lỗi nếu có gì đó sai (chẳng hạn như kiểu tham số sai) trong khi ghi đè phương thức.
Ví dụ 2: Ví dụ về chú thích @Override
class Animal {
// overridden method
public void display(){
System.out.println("I am an animal");
}
}
class Dog extends Animal {
// overriding method
@Override
public void display(){
System.out.println("I am a dog");
}
public void printMessage(){
display();
}
}
class Main {
public static void main(String[] args) {
Dog dog1 = new Dog();
dog1.printMessage();
}
}
Đầu ra
I am a dog
Trong ví dụ này, bằng cách tạo một đối tượng dog1 của lớp Dog , chúng ta có thể gọi phương thức printMessage () của nó sau đó thực thi display()
câu lệnh.
Vì display()
được định nghĩa trong cả hai lớp, nên phương thức của lớp con Dog ghi đè phương thức của lớp cha Animal . Do đó, display()
lớp con được gọi.
3. @SuppressWarnings
Như tên cho thấy, @SuppressWarnings
chú thích hướng dẫn trình biên dịch loại bỏ các cảnh báo được tạo ra trong khi chương trình thực thi.
Chúng tôi có thể chỉ định loại cảnh báo sẽ bị loại bỏ. Các cảnh báo có thể bị loại bỏ là dành riêng cho trình biên dịch nhưng có hai loại cảnh báo: không dùng nữa và không được chọn .
Để loại bỏ một danh mục cảnh báo cụ thể, chúng tôi sử dụng:
@SuppressWarnings("warningCategory")
Ví dụ,
@SuppressWarnings("deprecated")
Để loại bỏ nhiều loại cảnh báo, chúng tôi sử dụng:
@SuppressWarnings({"warningCategory1", "warningCategory2"})
Ví dụ,
@SuppressWarnings({"deprecated", "unchecked"})
Category deprecated
hướng dẫn trình biên dịch loại bỏ các cảnh báo khi chúng tôi sử dụng phần tử không được dùng nữa.
Category unchecked
hướng dẫn trình biên dịch loại bỏ các cảnh báo khi chúng ta sử dụng các loại thô.
Và, các cảnh báo không xác định được bỏ qua. Ví dụ,
@SuppressWarnings("someundefinedwarning")
Ví dụ 3: Ví dụ về chú thích @SuppressWarnings
class Main {
@Deprecated
public static void deprecatedMethod() {
System.out.println("Deprecated method");
}
@SuppressWarnings("deprecated")
public static void main(String args[]) {
Main depObj = new Main();
depObj. deprecatedMethod();
}
}
Đầu ra
Deprecated method
Ở đây, deprecatedMethod()
đã được đánh dấu là không dùng nữa và sẽ đưa ra cảnh báo trình biên dịch khi được sử dụng. Bằng cách sử dụng @SuppressWarnings("deprecated")
chú thích, chúng ta có thể tránh các cảnh báo của trình biên dịch.
4. @SafeVarargs
Các @SafeVarargs
chú thích khẳng định rằng phương pháp chú thích hoặc constructor không thực hiện hoạt động không an toàn trên varargs của nó (số biến của tham số).
Chúng tôi chỉ có thể sử dụng chú thích này trên các phương thức hoặc hàm tạo không thể bị ghi đè. Điều này là do các phương thức ghi đè chúng có thể thực hiện các hoạt động không an toàn.
Trước Java 9, chúng ta chỉ có thể sử dụng chú thích này trên các phương thức cuối cùng hoặc phương thức tĩnh vì chúng không thể bị ghi đè. Bây giờ chúng ta cũng có thể sử dụng chú thích này cho các phương thức riêng tư.
Ví dụ 4: Ví dụ về chú thích @SafeVarargs
import java.util.*;
class Main {
private void displayList(List<String>... lists) {
for (List<String> list : lists) {
System.out.println(list);
}
}
public static void main(String args[]) {
Main obj = new Main();
List<String> universityList = Arrays.asList("Tribhuvan University", "Kathmandu University");
obj.displayList(universityList);
List<String> programmingLanguages = Arrays.asList("Java", "C");
obj.displayList(universityList, programmingLanguages);
}
}
Cảnh báo
Type safety: Potential heap pollution via varargs parameter lists Type safety: A generic array of List<String> is created for a varargs parameter
Đầu ra
Note: Main.java uses unchecked or unsafe operations. [Tribhuvan University, Kathmandu University] [Tribhuvan University, Kathmandu University] [Java, C]
Ở đây, chỉ định một đối số có độ dài thay đổi của kiểu . Điều này có nghĩa là phương thức có thể có không hoặc nhiều đối số.List
... lists
List
displayList()
Chương trình trên biên dịch không có lỗi nhưng đưa ra cảnh báo khi @SafeVarargs
chú thích không được sử dụng.
Khi chúng tôi sử dụng @SafeVarargs
chú thích trong ví dụ trên,
@SafeVarargs private void displayList(List<String>... lists) { ... }
Chúng tôi nhận được cùng một đầu ra nhưng không có bất kỳ cảnh báo nào. Các cảnh báo bỏ chọn cũng bị loại bỏ khi chúng tôi sử dụng chú thích này.
5. @F FunctionInterface
Java 8 lần đầu tiên giới thiệu @FunctionalInterface
chú thích này . Chú thích này chỉ ra rằng khai báo kiểu mà nó được sử dụng là một giao diện chức năng. Một giao diện chức năng chỉ có thể có một phương thức trừu tượng.
Ví dụ 5: Ví dụ về chú thích @F FunctionInterface
@FunctionalInterface
public interface MyFuncInterface{
public void firstMethod(); // this is an abstract method
}
Nếu chúng ta thêm một phương thức trừu tượng khác, giả sử
@FunctionalInterface
public interface MyFuncInterface{
public void firstMethod(); // this is an abstract method
public void secondMethod(); // this throws compile error
}
Bây giờ, khi chúng tôi chạy chương trình, chúng tôi sẽ nhận được cảnh báo sau:
Unexpected @FunctionalInterface annotation @FunctionalInterface ^ MyFuncInterface is not a functional interface multiple non-overriding abstract methods found in interface MyFuncInterface
Không bắt buộc phải sử dụng @FunctionalInterface
chú thích. Trình biên dịch sẽ coi bất kỳ giao diện nào đáp ứng định nghĩa giao diện chức năng là giao diện chức năng.
Chúng tôi sử dụng chú thích này để đảm bảo rằng giao diện chức năng chỉ có một phương thức trừu tượng.
Tuy nhiên, nó có thể có bất kỳ số lượng phương thức mặc định và tĩnh nào vì chúng có một phần triển khai.
@FunctionalInterface
public interface MyFuncInterface{
public void firstMethod(); // this is an abstract method
default void secondMethod() { ... }
default void thirdMethod() { ... }
}
Chú thích tùy chỉnh
Cũng có thể tạo các chú thích tùy chỉnh của riêng chúng tôi.
Cú pháp của nó là:
[Access Specifier] @interface<AnnotationName> { DataType <Method Name>() [default value]; }
Đây là những gì bạn cần biết về chú thích tùy chỉnh:
- Annotations can be created by using
@interface
followed by the annotation name. - The annotation can have elements that look like methods but they do not have an implementation.
- The default value is optional. The parameters cannot have a null value.
- The return type of the method can be primitive, enum, string, class name or array of these types.
Ví dụ 6: Ví dụ về chú thích tùy chỉnh
@interface MyCustomAnnotation {
String value() default "default value";
}
class Main {
@MyCustomAnnotation(value = "programiz")
public void method1() {
System.out.println("Test method 1");
}
public static void main(String[] args) throws Exception {
Main obj = new Main();
obj.method1();
}
}
Đầu ra
Test method 1
Chú thích meta
Chú thích meta là chú thích được áp dụng cho các chú thích khác.
1. @Retention
Các @Retention
chú thích định mức lên đến đó chú thích sẽ có sẵn.
Cú pháp của nó là:
@Retention(RetentionPolicy)
Có 3 loại chính sách lưu giữ:
- RetentionPolicy.SOURCE – The annotation is available only at the source level and is ignored by the compiler.
- RetentionPolicy.CLASS – The annotation is available to the compiler at compile-time, but is ignored by the Java Virtual Machine (JVM).
- RetentionPolicy.RUNTIME – The annotation is available to the JVM.
Ví dụ,
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation{ ... }
2. @Documented
Theo mặc định, các chú thích tùy chỉnh không được bao gồm trong tài liệu Java chính thức . Để đưa chú thích của chúng tôi vào tài liệu Javadoc, chúng tôi sử dụng @Documented
chú thích.
Ví dụ,
@Documented
public @interface MyCustomAnnotation{ ... }
3. @Target
Chúng tôi có thể hạn chế áp dụng chú thích cho các mục tiêu cụ thể bằng cách sử dụng @Target
chú thích.
Cú pháp của nó là:
@Target(ElementType)
Có ElementType
thể có một trong các loại sau:
Element Type | Target |
---|---|
ElementType.ANNOTATION_TYPE | Annotation type |
ElementType.CONSTRUCTOR | Constructors |
ElementType.FIELD | Fields |
ElementType.LOCAL_VARIABLE | Local variables |
ElementType.METHOD | Methods |
ElementType.PACKAGE | Package |
ElementType.PARAMETER | Parameter |
ElementType.TYPE | Any element of class |
Ví dụ,
@Target(ElementType.METHOD)
public @interface MyCustomAnnotation{ ... }
Trong ví dụ này, chúng tôi đã giới hạn việc sử dụng chú thích này chỉ cho các phương thức.
Lưu ý: Nếu loại đích không được xác định, chú thích có thể được sử dụng cho bất kỳ phần tử nào.
4. @ Thừa kế
Theo mặc định, kiểu chú thích không thể được kế thừa từ lớp cha. Tuy nhiên, nếu chúng ta cần kế thừa một chú thích từ lớp cha sang lớp con, chúng ta sử dụng @Inherited
chú thích.
Cú pháp của nó là:
@Inherited
Ví dụ,
@Inherited
public @interface MyCustomAnnotation { ... }
@MyCustomAnnotation
public class ParentClass{ ... }
public class ChildClass extends ParentClass { ... }
5. @ lặp lại
Một chú thích đã được đánh dấu @Repeatable
có thể được áp dụng nhiều lần cho cùng một khai báo.
@Repeatable(Universities.class)
public @interface University {
String name();
}
Giá trị được xác định trong @Repeatable
chú thích là chú thích vùng chứa. Chú thích vùng chứa có giá trị biến kiểu mảng của chú thích có thể lặp lại ở trên. Đây Universities
là loại chú thích có chứa.
public @interface Universities {
University[] value();
}
Bây giờ, @University
chú thích có thể được sử dụng nhiều lần trên cùng một khai báo.
@University(name = "TU")
@University(name = "KU")
private String uniName;
Nếu chúng ta cần truy xuất dữ liệu chú thích, chúng ta có thể sử dụng API phản chiếu .
Để truy xuất giá trị chú thích, chúng tôi sử dụng getAnnotationsByType()
hoặc getAnnotations()
phương pháp được xác định trong API phản chiếu.