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.