Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Tại sao cần @SafeVarargs trong Java 9?

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 final hoặc private method (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".