Các loại chú thích Java

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 @Deprecatedchú 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 @deprecatedthẻ 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 @Overridequy đị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 @Overridekhi 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, @SuppressWarningschú 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 deprecatedhướ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 uncheckedhướ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 @SafeVarargschú 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 ... listsListdisplayList()

Chương trình trên biên dịch không có lỗi nhưng đưa ra cảnh báo khi @SafeVarargschú thích không được sử dụng.

Khi chúng tôi sử dụng @SafeVarargschú 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 @FunctionalInterfacechú 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 @FunctionalInterfacechú 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 @Retentionchú 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 @Documentedchú 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 @Targetchú thích.

Cú pháp của nó là:

@Target(ElementType)

Có ElementTypethể có một trong các loại sau:

Element TypeTarget
ElementType.ANNOTATION_TYPEAnnotation type
ElementType.CONSTRUCTORConstructors
ElementType.FIELDFields
ElementType.LOCAL_VARIABLELocal variables
ElementType.METHODMethods
ElementType.PACKAGEPackage
ElementType.PARAMETERParameter
ElementType.TYPEAny 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 @Inheritedchú 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 @Repeatablecó 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 @Repeatablechú 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 Universitieslà loại chú thích có chứa.

public @interface Universities {
  University[] value();
}

Bây giờ, @Universitychú 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.









Gõ tìm kiếm nhanh...