有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    原来的方法才是正确的方法。任何其他方法都会丢失编译器类型检查,或者使用起来更麻烦

    尽管builder可能是一种选择:

    FieldSet set = FieldSet.builder()
            .add("stringField", "aaa")
            .add("booleanField", Boolean.FALSE)
            .add("intValue", new Integer(123))
            .build();