Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用varargs传递参数对,而不会遇到错误模式_Java - Fatal编程技术网

Java 使用varargs传递参数对,而不会遇到错误模式

Java 使用varargs传递参数对,而不会遇到错误模式,java,Java,最初我们有一个对象,其构造如下: FieldSet set = new FieldsSet( new Field("stringField", "aaa"), new Field("booleanField", Boolean.FALSE), new Field("intValue", new Integer(123)); 但每次构造Field对象似乎都很乏味(在本例中,我给出了3个字段,但通常是20个)。因此,我们添加了以下方法: public static Fiel

最初我们有一个对象,其构造如下:

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()]));
} 
正如您所看到的,它带有一种错误的模式,即使用参数放置来传递两种类型的参数

所以我想找到一个更好的模式

  • 允许用户以相当简洁的形式构造
    字段集
    ,即避免多次繁琐地创建
    字段
    对象
  • 避免错误模式,如上面的模式
以下是字段集和字段的相关部分:

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字段=新的ArrayList();
公共字段集(字段…字段){
用于(字段:字段){
this.fields.add(字段);
}
}
}
公共类字段{
私有字符串名称;
私人客体价值;
公共字段(字符串名称、对象值){
this.name=名称;
这个值=值;
}
}
注意:我在这里提供的代码是专门以最简单的形式演示问题的,因此请不要注意其他一些低效之处(例如,在数组和
ArrayList
之间来回转换-该问题不是真正代码的一部分)


谢谢

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

尽管a可能是一种选择:

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

如果有人发明了一种类似于构建器模式的东西,它有一个接受两个参数的方法
addField
,这样就可以用它以一种非常干净的方式构建一个
FieldSet
实例。那太好了。@Tom这的确是一个好建议,为什么不把它作为一个答案发布呢?@AndreyMormysh,因为他感觉到了我已经这么做的力量的干扰@安德烈亚斯:哈哈,我明白了。。此外,当您需要处理多个类型和对象(字段集),而这些对象不能描述为类,而只能描述为一堆数据时,Java在这些情况下会变得不那么方便。@AndreyMormysh我现在很少写答案,但主要是一条注释,以将OP推向正确的方向。当问题本身有趣或不明显时,我可能会回答:)。
FieldSet set = FieldSet.builder()
        .add("stringField", "aaa")
        .add("booleanField", Boolean.FALSE)
        .add("intValue", new Integer(123))
        .build();