Установка более 100 объектов с разными значениями - PullRequest
1 голос
/ 07 апреля 2020

Я работаю над унаследованным проектом, где мы потребляем сервис SOAP, который требует от нас установки большого значения поля, прежде чем мы сможем отправить его в объект JAXB. В настоящее время мы делаем это с помощью метода установки, как показано ниже -

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 будет громоздкой для сопровождения, если в случае Поставщик веб-сервиса меняет любое имя метки, было бы очень сложно найти и изменить имя метки c.

Другой способ установить это использование конструктора, но это не является правильным вариантом. Я искал, есть ли другой способ сделать вышеупомянутую задачу, которая была бы очень полезна.

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

Вы можете создать 100 FieldValue объектов и добавить их в список, используя для блока:

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

Затем вы можете написать метод в классе FieldValue для установки fieldName и значения объектов:

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

и теперь вы можете установить fieldName и значение для каждого элемента сгенерированного списка:

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

Другой способ - использовать массив вместо 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());

ОБНОВЛЕНО еще одним решением: я думаю, что объявление setFieldNameAndValue в классе FieldValue не очень хороший способ. Пожалуйста, забудьте, что решение: 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);
  }

Надеюсь, что эти строки помогут вам:)

1 голос
/ 07 апреля 2020

Если у вас есть класс пользовательского интерфейса, содержащий поля, вы всегда можете создать стандартный c список имен полей. Более того, вы можете создать 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);

Если вы хотите выполнить рефакторинг, просто измените имя в этом перечислении.

ОБНОВЛЕНО на основе комментария ОП Не идеальный способ, но вы Можно создать список значений для вызова 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);
   }
}
...