设置超过 100 个具有不同值的对象

Setting More than 100 Object having different Values

我正在处理一个遗留项目,我们在其中使用 SOAP 服务,该服务需要在我们将其发送到 JAXB 对象之前设置大量字段值。 目前我们正在通过 setter 方法进行操作,如下所示 -

需要设置100个这样的标签,

    FieldValue field1 = new FieldValue(); // field value
    field1.setFieldName("FieldLabel1");
    field1.setValue(fileValue);
    lstfield.add(field1);

    FieldValue field2 = new FieldValue(); // Action date in format 12-Feb-14
    field2.setFieldName("FieldLabel2");
    field2.setValue(DateUtill.getCurrentdate());
    lstfield.add(field2);

设置 100 个 FieldValue 对象对于维护来说会很麻烦,如果万一 Web 服务提供商更改任何标签名称,查找和更改标签名称将非常忙碌。

另一种设置方法是使用构造函数,但这似乎不是正确的选择。 我正在寻找是否有任何其他方法可以完成上述任务,这将非常有帮助。

如果您有一个包含字段的 UI class,您始终可以创建字段名称的静态列表。更好的是,您可以创建一个 enum。例如:

public enum Field {
    FIELD_1("FieldName1"),
    ...
    String name;
    Field(String name) {this.name = name;}
    public String getName() { return this.name; }
}

...

FieldValue field1 = new FieldValue(); // field value
field1.setFieldName(Field_1.getName());
field1.setValue(fileValue);
lstfield.add(field1);

如果要重构,只需更改此枚举中的名称即可。

根据 OP 的评论更新 这不是理想的方式,但您可以为 setValue 调用创建一个值列表,然后使用以下方法添加字段:

public void setFields(Object[] values) {
   for (int i = 0; i < Field.values().length(); ++i) {
       final FieldValue fv = new FieldValue();
       fv.setFieldName(Field.values()[i].getName());
       fv.setValue(values[i]));
       lstField.add(fv);
   }
}

您可以创建 100 个 FieldValue 对象并使用 for 块将它们添加到列表中:

    List<FieldValue> fieldValueList = new ArrayList<>();
    final int NUM_OF_OBJECTS = 100;
    for (int i = 0; i < NUM_OF_OBJECTS; i++) {
      fieldValueList.add(new FieldValue());
    }

然后可以在FieldValueclass中写一个方法来设置对象的字段名和值:

  public void setFieldNameAndValue(String fieldName, Object value) {
    setFieldName(fieldName);
    setValue(value);
  }

现在您可以为生成的列表的每个项目设置字段名称和值:

    fieldValueList.get(0).setFieldNameAndValue("FieldLabel1", fileValue);
    fieldValueList.get(1).setFieldNameAndValue("FieldLabel2", DateUtill.getCurrentdate());
    // set fieldName and value for remained objects

另一种方法是使用 Array 而不是 List:

    final int NUM_OF_OBJECTS = 100;
    FieldValue[] fieldValues = new FieldValue[NUM_OF_OBJECTS];
    for (int i = 0; i < NUM_OF_OBJECTS; i++) {
      fieldValues[i] = new FieldValue();
    }

    fieldValues[0].setFieldNameAndValue("FieldLabel1", fileValue);
    fieldValues[1].setFieldNameAndValue("FieldLabel2", DateUtill.getCurrentdate());

已更新 另一种解决方案: 我认为在 FieldValue class 中声明 setFieldNameAndValue 不是一个好方法。请忘记那个解决方案 :D

    final int NUM_OF_OBJECTS = 100;
    final ArrayList<FieldValue> filedValueList = new ArrayList<>(NUM_OF_OBJECTS);
    addNewFieldValue(filedValueList, "fieldName1", fieldValue);
    addNewFieldValue(filedValueList, "fieldName2", DateUtill.getCurrentdate());

addNewFieldValue可以这样编程:

  private static void addNewFieldValue(ArrayList<FieldValue> filedValueList, String fieldName, Object value) {
    final FieldValue fieldValue = new FieldValue();
    fieldValue.setFieldName(fieldName);
    fieldValue.setValue(value);
    filedValueList.add(fieldValue);
  }

希望这些台词能帮到你:)