说起可变参数,我们先看下面代码段,对它有个直观的认识,下方的红字明确地解释了可变参数的意思:
1 public class VarargsDemo{ 2 3 static int sum(int... args) { 4 int sum = 0; 5 for(int arg:args) 6 sum += arg; 7 return sum; 8 } 9 public static void main(String args[]) throws FileNotFoundException { 10 System.out.println(sum(1,2,3,4,5,6,7,8,9,10)); System.out.println(sum(1,2,3,4,5,6)); System.out.println(sum(1,2,3); 11 } 12 }
可变参数的机制原理:
1.创建一个array[],它的size就是所传参数的个数;
2.将参数放入到array[]中;
3.将array[]传给方法。
看起来这个可变参数非常的便利,我们不用去考虑参数的个数,随心所欲的使用。但是这个观点不对,它给我带来便利的同时,也有很多潜在的危险,我们要慎重使用。
1.如果所传参数为null,方法里有对参数的引用(比如 args[0])时,那么就会在运行时失败(编译时却检测不出错误);
2.在对性能有要求时,我们要慎重考虑是否使用可变参数。因为,可变参数方法的调用都会引起array的内存分配和初始化,这会给性能带来损耗。
→
解决方案:
假设调用可变参数的方法中,有95%只是调用参数个数小于4,那么就可以将个数小于4的方法,用普通方法定义;剩余的5%,调用可变参数方法。
1 public void foo() {} 2 public void foo(int a1) {} 3 public void foo(int a1, int a2) {} 4 public void foo(int a1, int a2, int a3) {} 5 public void foo(int a1, int a2, int a3, int... rest) {}
3.在打包作业时,还有一点需要注意。
当可变参数的使用发生变动时(比如:以前用可变参数方法,现在用普通方法),所有引用参数列表的类的.class都要重新生成,因为可变参数的array的分配和初始化是在编译期间完成的。
参考文献:
《Effective Java》 第三版 Item 53
原文地址:https://www.cnblogs.com/lihao007/p/10325855.html
时间: 2024-09-30 20:55:12