Varargs (variable arguments) cho phép phương thức nhận số lượng tham số biến đổi. Khi dùng varargs với generics, compiler Java < 9 cảnh báo unchecked generic array creation và heap pollution cho tất cả phương thức – ngay cả những phương thức an toàn.
@SafeVarargs (Java 7+ nhưng quan trọng hơn từ Java 9)Suppress cảnh báo này khi developer đảm bảo phương thức không gây heap pollution.
Ví dụ có cảnh báo (không @SafeVarargs)
import java.util.Arrays;
import java.util.List;
public class SafeVarargsTest1 {
public static void main(String args[]) {
SafeVarargsTest1 test = new SafeVarargsTest1();
test.varargsMethod(Arrays.asList("Adithya", "Jaidev"), Arrays.asList("Raja", "Chaitanya"));
}
private void varargsMethod(List<String>... list) {
for (List list1 : list)
System.out.println(list1);
}
}
Kết quả compile với -Xlint:unchecked
SafeVarargsTest1.java:7: warning: [unchecked] unchecked generic array creation for varargs parameter of type List<String>[] SafeVarargsTest1.java:9: warning: [unchecked] Possible heap pollution from parameterized vararg type List<String>
Ví dụ dùng @SafeVarargs
public class SafeVarargsTest2 {
public static void main(String args[]) {
SafeVarargsTest2 test = new SafeVarargsTest2();
test.varargsMethod(Arrays.asList("Adithya", "Jaidev"), Arrays.asList("Raja", "Chaitanya"));
}
@SafeVarargs
private void varargsMethod(List<String>... list) {
for (List list1 : list)
System.out.println(list1);
}
}
Kết quả
[Adithya, Jaidev] [Raja, Chaitanya]
Không còn cảnh báo.
Khi nào dùng @SafeVarargs?
- Phương thức không lưu trữ mảng varargs vào field/static variable.
- Không trả về mảng varargs ra ngoài.
- Chỉ đọc (read-only) các phần tử trong varargs.
- Áp dụng cho
finalhoặcprivatemethod (Java 9 cho phép trên private method).
@SafeVarargs cam kết với compiler: "Tôi đảm bảo an toàn, hãy tắt cảnh báo".