@SafeVarargs注解

原文:https://www.studytonight.com/java-9/safevarargs-annotation

@SafeVarargs 注解用于对变量参数执行安全操作。接受变量参数的方法可能会导致不安全的执行。为了避免这个问题,Java 提供了@SafeVarargs 注解。

此注解只能应用于不能被覆盖的方法。其中包括静态方法最终实例方法,但是从 Java 9 开始,可以应用到私有实例方法

示例:Java 8 最终方法

让我们创建一个使用 @SafeVarargs 到最终方法的例子。这里我们有一个 display()方法,它接受变量参数。

public class Main { 
    @SafeVarargs
    final void display(List... items) {
        for (List item : items) {  
            System.out.println(item);  
        }  
    }
    public static void main(String[] args){
        Main m = new Main();  
        List<String> list = new ArrayList<String>();  
        list.add("Book");  
        list.add("Scale");  
        m.display(list);  
    }
}

【书、秤】

示例:Java 8 静态方法

让我们再来看一个场景,在这个场景中,我们使用@ safevarags注解到一个静态方法。因为静态方法不能被覆盖,所以可以应用注解。

public class Main { 
    @SafeVarargs
    static void display(List... items) {
        for (List item : items) {  
            System.out.println(item);  
        }  
    }
    public static void main(String[] args){
        Main m = new Main();  
        List<String> list = new ArrayList<String>();  
        list.add("Book");  
        list.add("Scale");  
        m.display(list);  
    }
}

【书、秤】

示例:Java 8

如果我们用私有方法使用 @SafeVarargs 注解并用 Java 8 编译,那么我们会得到一个编译时错误。请看下面的例子。

import java.util.ArrayList;
import java.util.List;

public class Main { 
    @SafeVarargs
    private void display(List... items) {
        for (List item : items) {  
            System.out.println(item);  
        }  
    }
    public static void main(String[] args){
        Main m = new Main();  
        List<String> list = new ArrayList<String>();  
        list.add("Book");  
        list.add("Scale");  
        m.display(list);  
    }
}

Main.java:6:错误:SafeVarargs 注解无效。实例方法显示(列表...)不是最终的。 私人作废显示(列表...项目){ ^ 1 错误

示例:Java 9

这里,我们有一个私有方法,它接受变量参数并使用 Java 9 编译。这一次它运行良好,并产生了预期的结果。

import java.util.ArrayList;
import java.util.List;

public class Main { 
    @SafeVarargs
    private void display(List... items) {
        for (List item : items) {  
            System.out.println(item);  
        }  
    }
    public static void main(String[] args){
        Main m = new Main();  
        List<String> list = new ArrayList<String>();  
        list.add("Book");  
        list.add("Scale");  
        m.display(list);  
    }
}

书 尺

示例:无@安全变量

如果我们不使用私有实例方法的注解,而是使用 Java 9 执行它,那么编译器会执行代码,但会报告一个警告。请看下面的例子。

import java.util.ArrayList;
import java.util.List;

public class Main { 
    // No annotation
    private void display(List... items) {
        for (List item : items) {  
            System.out.println(item);  
        }  
    }
    public static void main(String[] args){
        Main m = new Main();  
        List<String> list = new ArrayList<String>();  
        list.add("Book");  
        list.add("Scale");  
        m.display(list);  
    }
}

注意:Main.java 使用未经检查或不安全的操作。 注意:用-Xlint 重新编译:有关详细信息,请取消选中。 书 秤