@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 重新编译:有关详细信息,请取消选中。 书 秤