国庆期间技术精进09:慎用可变参数

115 阅读3分钟

明天就要上班啦,今天制定10月计划,每天要做哪些事情,到月底要达到什么的目标!突然想去看电影啦!!!

说起可变参数,我们先看下面代码段,对它有个直观的认识,下方的sum方法明确地解释了可变参数的意思

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));
           System.out.println(sum(1,2,3,4,5,6));
           System.out.println(sum(1,2,3);
11     }
12 }
  • Effective java书中定义:

jdk1.5发行版增加了可变参数方法,一般称作variable arity method(可匹配不同长度的变量的方法)。可变参数方法接受0个或者多个指定类型的参数。可变参数机制通过先创建一个数组,数组的大小为在调用位置所传递的参数数量,然后将参数值传到数组中,最后将数组传递给方法。

可变参数的机制原理:

1.创建一个array[],它的size就是所传参数的个数;

2.将参数放入到array[]中;

3.将array[]传给方法。

看起来这个可变参数非常的便利,我们不用去考虑参数的个数,随心所欲的使用。但是这个观点不对,它给我带来便利的同时,也有很多潜在的危险,我们要慎重使用。

当我们需要定义参数数目不定的方法时,可变参数时一种很方便的方式,但是不应该被过度滥用,参数列表不应该只有一个可变参数,避免调用方一个参数也不传导致程序出现问题.应该如下所示,用一个固定参数来进行区分

1.如果所传参数为null,方法里有对参数的引用(比如 args[0])时,那么就会在运行时失败(编译时却检测不出错误);

2.在对性能有要求时,我们要慎重考虑是否使用可变参数。因为,可变参数方法的调用都会引起array的内存分配和初始化,这会给性能带来损耗。

  • 错误做法: 下面是一个可变参数方法,带有int参数的一个序列,并返回它们的总和。正如你期望的,sum(1,2,3)的值为6,sum()的值为0。
 public static void main(String[] args) {
        int sum = sum();
        System.out.println(sum);
    }
    public static int sum(int... args){
        int sum = 0;
        for (int arg : args) {
            sum += arg;
        }
        return sum;
    }
  • 正确做法 声明该方法带有两个参数,一个是指定类型的正常参数,另一个是这种类型的varargs参数。
public static void main(String[] args) {
        int sum = sum(1, 3, 4, 5, 6, 7, 8, 9);
        System.out.println(sum);
    }
    public static int sum(int first,int... args){
        for (int arg : args) {
            first = first + arg;
        }
        return first;
    }

特别提醒

当可变参数的使用发生变动时(比如:以前用可变参数方法,现在用普通方法),所有引用参数列表的类的.class都要重新生成,因为可变参数的array的分配和初始化是在编译期间完成的。

  • 参考:

www.sohu.com/a/156752352…

www.bubuko.com/infodetail-…