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();