java使用varargs传递参数对,而不会遇到错误模式
最初我们有一个对象,其构造如下:
FieldSet set = new FieldsSet(
new Field("stringField", "aaa"),
new Field("booleanField", Boolean.FALSE),
new Field("intValue", new Integer(123));
但每次构造Field对象似乎都很乏味(在本例中,我给出了3个字段,但通常是20个)。因此,我们添加了以下方法:
public static FieldSet getNewInstance(Object... fieldPairs) {
ArrayList<Field> fields = new ArrayList<Field>();
for (int i = 0; i < fieldPairs.length; i += 2) {
fields.add(new Field(fieldPairs[i].toString(), fieldPairs[i + 1]));
}
return new FieldSet(fields.toArray(new Field[fields.size()]));
}
我们可以这样使用:
FieldSet set = FieldSet.getNewInstance(
"stringField", "aaa",
"booleanField", Boolean.FALSE,
"intValue", new Integer(123));
正如您所看到的,它带有一种错误的模式,即使用参数放置来传递两种类型的参数
所以我想找到一个更好的模式
- 允许用户以相当简洁的形式构造
FieldSet
,即避免多次繁琐地创建Field
对象 - 避免错误模式,如上面的模式
以下是字段集和字段的相关部分:
public class FieldSet {
ArrayList<Field> fields = new ArrayList<Field>();
public FieldSet(Field... fields) {
for(Field field : fields) {
this.fields.add(field);
}
}
}
public class Field {
private String name;
private Object value;
public Field(String name, Object value) {
this.name = name;
this.value = value;
}
}
注意:我在这里提供的代码是专门以最简单的形式演示这个问题的,所以请不要注意其他一些低效之处(例如,在数组和ArrayList
之间来回转换-这个问题不是真正代码的一部分)
谢谢
# 1 楼答案
原来的方法才是正确的方法。任何其他方法都会丢失编译器类型检查,或者使用起来更麻烦
尽管builder可能是一种选择: