vararg的意思是变量参数,它是与Java语言语法非常不同的一个概念。常见情况下,我们通过限制输入参数的个数和类型、返回数据类型和抛出的异常来定义方法签名来与方法的调用者实现契约。使用动态参数特性,我们可以部分的克服该限制,使得签名变得动态化。你可能会说动态签名并不新鲜。如下两点你已经使用过多次来避免添加或删除方法签名中参数对客户端调用的影响。
- 使用数组或集合作为输入参数
- 使用对象将输入参数的属性进行封装
现在Java语言自身提供了动态参数特性以支持变量输入参数。当然它不是在任何场景下都非常的自然,但是可以被用到很多情况下。
Java编程人员常常需要为方法定义一个包含多个值的参数。这时可以采用List或数组的形式,如下例所示。
public int add(int[] list) {
int sum = 0;
for (int i=0; i < list.length; i++) {
sum += list[i];
}
return sum;
}
也可以将它实现为几个重载的方法,每个方法接受不同数量的int参数。这样做有时可以令方法更容易使用,因为调用代码不需要首先创建一个数组。
public int add(int a, int b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
public int add(int a, int b, int c, int d) {
return a + b + c + d;
}
如果只有少量值,这对于调用代码更为方便,因为现在可以使用add(12,14,16)来代替add(new int[] {12,14,16})。但是,编写类似这样的方法存在问题,需要为每种可能的参数组合编写不同版本的方法。如果希望在方法的使用方式上具有最大的灵活性则与其创建一个庞大的具有上千个方法的类,不如对重载的方法接受的参数数量进行很小的限制。
在Java 5中,可以编写一个方法以使它允许可变数量的参数并让编译器完成将列表包装到一个数组中的操作。虽然内部仍是处理数组,但此时的编译器已隐藏了细节。以下的代码使用可变参数(vararg)重写了add方法。
public int add(int... list) {
int sum = 0;
for (int item : list) {
sum += item;
}
return sum;
}
注意,那些奇怪的圆点正是可变参数的实际语法!并且,由于这种改动要用到Java 5,我们也可以趁机使用Java 5增强的for循环语法。一旦按照这种方式编写了方法,可以使用实际数量的参数来调用它!此外,还可以传递一个作为参数的数组(但不允许是List或Collection对象):
add(1,3,5,7,9,11,13,15,17,19,21,23,25);
add(new int[] {12,14,16});
需要注意的是当定义一个参数列表时该语法只能使用一次,并且它必须是最后一项。以下的代码不能正常运行,因为可变参数不是最后一项:
public void badMethod(int... data, String comment) { } // wrong!
必须将此代码改写成以下形式:
public void goodMethod(String comment, int... data) { }
在一些情况下,在方法定义中使用可变参数可以使方法更简便。这在参数列表包含字面(硬编码)值的情况下尤其如此,如上面的示例中给出的int值。
<!-- page -->