在Java1.5中创建可变参数[Varargs] (3)
public Guitar(String builder, String model,String…… features, float…… stringHeights)
另外,省略号必须作为方法的最后一个参数。
如果你不需要传递任何可变参数呢?
那没关系,你只需要以旧的方式调用构造器:
Guitar guitar = new Guitar("Martin", "D-18");
我们再仔细看看,虽然程序中没有与下面代码相匹配的构造器:
public Guitar(String builder, String model)
那么,代码到底传递了什么呢?作为可变参数的特例,在参数中不传递东西是一个合法的选项。所以,当你看到 String…… features,你应该把它认为是零个或者更多个String参数。这省却你再去创建另一个不带可变参数构造器的麻烦。
重复可变长度参数类表
所有这些可变参数是很好的。但是实际上,如果你不在你的方法中使用它们的话,他们显然仅仅是吸引眼球的东西或是窗户的装饰品而已。
然而,你可以像你使用数组一样来使用可变参数,你会觉得这种用法很简单。
那我怎么来使用可变参数呢?
首先你要确保阅读了“创建一个可变长度的参数列表”,你会从中了解到可变参数方法最重要的东西,那就是我们把可变参数当作数组来看待。
所以,继续前面的例子,你可以写出下面的代码:
public Guitar(String builder, String model,
GuitarWood backSidesWood, GuitarWood topWood,float nutWidth,
GuitarInlay fretboardInlay, GuitarInlay topInlay,String... features) {
this.builder = builder;
this.model = model;
this.backSidesWood = backSidesWood;
this.topWood = topWood;
this.nutWidth = nutWidth;
this.fretboardInlay = fretboardInlay;
this.topInlay = topInlay;
for (String feature : features) {
System.out.println(feature);
}
}
上面的这段代码看上是不是不是那么的有吸引力?但这确实体现了可变参数的精髓。作为另一个例子,下面这个简单的方法从一组数字中计算出最大值:
public static int max(int first, int... rest) {
int max = first;
for (int i : rest) {
if (i > max)
max = i;
}
return max;
}
是不是,够简单吧?
那么如何存储可变长度参数呢?
正因为Java编译器把这些看作数组,所以数组显然是一个存储的好选择,这将在下面的例5-2中体现。
Example 5-2. 存储作为成员变量的可变参数
package com.oreilly.tiger.ch05;
public class Guitar {
private String builder;
private String model;
private float nutWidth;
private GuitarWood backSidesWood;
private GuitarWood topWood;
private GuitarInlay fretboardInlay;
private GuitarInlay topInlay;
private String[] features;
private static final float DEFAULT_NUT_WIDTH = 1.6875f;
public Guitar(String builder, String model, String... features) {
this(builder, model, null, null, DEFAULT_NUT_WIDTH, null, null, features);
}
public Guitar(String builder, String model,
GuitarWood backSidesWood, GuitarWood topWood,
float nutWidth, String... features) {
this(builder, model, backSidesWood, topWood, nutWidth, null, null, features);
}
public Guitar(String builder, String model,
GuitarWood backSidesWood, GuitarWood topWood,


您的位置:
