@SafeVarargs annotation trong Java

Java 7 giới thiệu @SafeVarargs annotation dùng để loại bỏ các cảnh bảo về unsafe operation khi một method có varargs (số lượng tham số có thể thay đổi).

@SafeVarargs chỉ có thể được sử dụng với các final, static method hoặc constructor vì chúng không thể được ghi đè.  Vì một phương thức có thể override vẫn có thể thực hiện thao tác không an toàn trên các varargs.

Java 9 còn cho phép chúng ta sử dụng @SafeVarargs trong các private method vì chúng cũng không thể override bởi các class con.

Giả sử chúng ta có ví dụ sau được viết với Java 9

import java.util.ArrayList;  
import java.util.List;  
public class JavaExample{  
    // We are not using @SafeVarargs annotation - Java 9
    private void print(List... names) {  
        for (List<String> name : names) {  
            System.out.println(name);  
        }  
    }  
    public static void main(String[] args) {  
        JavaExample obj = new JavaExample();  
        List<String> list = new ArrayList<String>();  
        list.add("Kevin");  
        list.add("Rick"); 
        list.add("Negan");
        obj.print(list);  
    }     
}

Cảnh báo sẽ xuất hiện

Type safety: Potential heap pollution via varargs parameter names
Type safety: A generic array of List is created for a varargs 
 parameter

Output

[Kevin, Rick, Negan]

Như chúng ta có thể thấy đọan code trên vẫn thực thi và cho kếy quả bình thường nhưng nó cũng khiến trình biên dịch thông báo một số cảnh báo.

Để loại bỏ những thông báo này chúng ta có thể sử dụng @SafeVarargs annotation

import java.util.ArrayList;  
import java.util.List;  
public class JavaExample{  
    @SafeVarargs
    private void print(List... names) {  
        for (List<String> name : names) {  
            System.out.println(name);  
        }  
    }  
    public static void main(String[] args) {  
        JavaExample obj = new JavaExample();  
        List<String> list = new ArrayList<String>();  
        list.add("Kevin");  
        list.add("Rick"); 
        list.add("Negan");
        obj.print(list);  
    }      
}

Khi thực thi đoạn chương trình trên chúng ta vẫn có kết quả tương tự tuy nhiên không còn các cảnh báo được tạo ra bởi trình biên dịch.

Note: Nếu chạy đoạn mã trên trong Java 7 và Java 8, bạn sẽ gặp lỗi biên dịch vì các chức năng này được thực hiện trong Java 9, trước Java 9 @SafeVarargs không thể sử dụng với private method.

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x