ฟีเจอร์ varargs (variable arguments) ถูกนำมารวมใน Java เพื่อสร้างเมธอดที่รับจำนวนอาร์กิวเมนต์ไม่คงที่ได้ โดยไม่ต้องใช้พารามิเตอร์แบบอาร์เรย์หรือ overload เมธอดซ้ำๆ
ก่อน Java 9 หาก varargs methods ใช้กับ generics จะมี warning message แม้ไม่ใช่ทุกเมธอดก็สร้าง heap pollution คอมไพเลอร์ก็เตือนทั้งหมด นั่นคือเหตุผลที่เพิ่ม @SafeVarargs ใน Java 9 เพื่อปิด warning เหล่านี้ หากเพิ่มแอนโนเตชันนี้ คอมไพเลอร์จะหยุดเตือน
คอมไพล์เพื่อดู warning
javac -Xlint:unchecked SafeVarargsTest1.java
ตัวอย่างที่มี Warning
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);
}
}
ผลลัพธ์ (มี Warning)
SafeVarargsTest.java:7: warning: [unchecked] unchecked generic array creation for varargs parameter of type List[]
SafeVarargsTest.java:9: warning: [unchecked] Possible heap pollution from parameterized vararg type List
[Adithya, Jaidev] [Raja, Chaitanya]
ตัวอย่างใช้ @SafeVarargs (ไม่มี Warning)
import java.util.Arrays;
import java.util.List;
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);
}
}
ผลลัพธ์ (ไม่มี Warning)
[Adithya, Jaidev] [Raja, Chaitanya]
@SafeVarargs ใช้ได้กับเมธอด final, static, และ private (เมธอดที่ไม่สามารถ override ได้) บอกคอมไพเลอร์ว่าเมธอดนี้ใช้ varargs อย่างปลอดภัย ไม่ก่อให้เกิด heap pollution