Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ทำไมต้องมี @SafeVarargs ใน Java 9

ฟีเจอร์ 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