Сравнить поля обьектов

168
31 марта 2019, 23:50

Задача - приходит два обьекта "старый" и "новый" вариант. Необходимо сравнить их поля и если они одинаковы - засетить в поле null, если разные - засетить в спецполя значения - "новое" и "старое".

Код рабочий, но до ужаса примитивный и не очень нравится по обьему, так как полей много. Может кто подскажет классный и оптимальный пример рабочего метода?

PS Пробовал рефлексией ходить по полям, но ничего толкового не получилось((

public static Parameter createObject(InventoriDto oldInventoriDto, InventoriDto newInventoriDto) {
    Parameter parameter = new Parameter();
    if (newInventoriDto.getFullName().equals(oldInventoriDto.getFullName())) {
        parameter.setId("1");
        parameter.setOldValue(null);
        parameter.setNewValue(null);
    } else {
        parameter.setId("1");
        parameter.setOldValue(oldInventoriDto.getFullName());
        parameter.setNewValue(newInventoriDto.getFullName());
    }
    if (newInventoriDto.getAddress().equals(oldInventoriDto.getAddress())) {
        parameter.setId("10");
        parameter.setOldValue(null);
        parameter.setNewValue(null);
    } else {
        parameter.setId("10");
        parameter.setOldValue(oldInventoriDto.getFullName());
        parameter.setNewValue(newInventoriDto.getFullName());
    }
    if (newInventoriDto.getNumberType().equals(oldInventoriDto.getNumberType())) {
        parameter.setId("8");
        parameter.setOldValue(null);
        parameter.setNewValue(null);
    } else {
        parameter.setId("8");
        parameter.setOldValue(oldInventoriDto.getNumberType());
        parameter.setNewValue(newInventoriDto.getNumberType());
    }
    return parameter;
}
Answer 1

оригинал - 1200 символов

вариант 1 - 700 символов

  public static Parameter createObject(InventoriDto oID, InventoriDto nID) {
    Parameter p = new Parameter();
    if (nID.gFN().equals(oID.gFN())) {
      p.setId("1");
      p.sOV(null);
      p.sNV(null);
    } else {
      p.setId("1");
      p.sOV(oID.gFN());
      p.sNV(nID.gFN());
    }
    if (nID.gA().equals(oID.gA())) {
      p.setId("10");
      p.sOV(null);
      p.sNV(null);
    } else {
      p.setId("10");
      p.sOV(oID.gFN());
      p.sNV(nID.gFN());
    }
    if (nID.gNT().equals(oID.gNT())) {
      p.setId("8");
      p.sOV(null);
      p.sNV(null);
    } else {
      p.setId("8");
      p.sOV(oID.gNT());
      p.sNV(nID.gNT());
    }
    return p;
  }

вариант 2 - 900 символов

  private static Parameter parameter;
  public static void createObject(InventoriDto oldInventoriDto, InventoriDto newInventoriDto) {
    parameter = new Parameter();
    if (newInventoriDto.getFullName().equals(oldInventoriDto.getFullName()))
      set("1", null, null);
    else
      set("1", oldInventoriDto.getFullName(), newInventoriDto.getFullName());

    if (newInventoriDto.getAddress().equals(oldInventoriDto.getAddress()))
      set("10", null, null);
    else
      set("10", oldInventoriDto.getFullName(), newInventoriDto.getFullName());

    if (newInventoriDto.getNumberType().equals(oldInventoriDto.getNumberType()))
      set("8", null, null);
    else
      set("8", oldInventoriDto.getNumberType(), newInventoriDto.getNumberType());
  }
  private static void set(String Id, Object Old, Object New) {
    parameter.setId(Id);
    parameter.setOldValue(Old);
    parameter.setNewValue(New);
  }
}

вариант 3 - 600 символов

public static Parameter param;
  public static void createObject(InventoriDto oID, InventoriDto nID) {
    param = new Parameter();
    if (nID.gFN().equals(oID.gFN()))
      set("1", null, null);
    else
      set("1", oID.gFN(), nID.gFN());

    if (nID.gA().equals(oID.gA()))
      set("10", null, null);
    else
      set("10", oID.gFN(), nID.gFN());

    if (nID.gNT().equals(oID.gNT()))
      set("8", null, null);
    else
      set("8", oID.gNT(), nID.gNT());
  }
  public static void set(String Id, Object Old, Object New) {
    param.setId(Id);
    param.setOldValue(Old);
    param.setNewValue(New);
  }
}

тут сложно что-то сократить не видя остальной части кода

Answer 2

Вы вполне можете использовать рефлексию, вызывая как методы так и поля объекта например по их названию, и передавая их параметрами в нужный метод. Это позволит рефакторить ваш код и вынести повторяющиеся блоки в отдельные методы.

// выносим в отдельный метод запись в поля объекта Parameter
// этот метод разумно добавить в методы самого класса  Parameter, но здесь он как бы отдельный
public static void setValues(Parameter parameter, String id, String oldValue, String newValue) {
    parameter.setId(id);
    parameter.setOldValue(oldValue);
    parameter.setNewValue(newValue);
}
// выносим в отдельный метод сравнение двух объектов InventoriDto по результаты работы любого метода
// здесь применяется рефлексия для вызова метода, название которого передано в параметре 
// тоже самое можно реализовать, если у InventoriDto будет не геттеры, а публичные поля 
public static void checkObjects(Parameter parameter, String id, InventoriDto o1, InventoriDto o2, String methodName) throws Exception {
    Method method = InventoriDto.class.getMethod(methodName);
    if (method.invoke(o1).equals(method.invoke(o2))) setValues(parameter,id, null, null);
    else setValues(parameter,id, method.invoke(o1).toString(), method.invoke(o2).toString());
}

// собственно интересующее нас тело получается таким компактным 
public static Parameter createObject(InventoriDto oldInventoriDto, InventoriDto newInventoriDto) throws Exception {
    Parameter parameter = new Parameter();
    checkObjects(parameter, "1", oldInventoriDto, newInventoriDto, "getFullName");
    checkObjects(parameter, "10", oldInventoriDto, newInventoriDto, "getAddress");
    checkObjects(parameter, "8", oldInventoriDto, newInventoriDto, "getNumberType");
    return parameter;
}

Не забудьте обработать исключения.

READ ALSO
java.sql.SQLException: The server time zone. MySQL 8

java.sql.SQLException: The server time zone. MySQL 8

Использую MySQL 8 на ОС Windows 10версия коннектора 8

148
Ищу аналог пробела в юникоде

Ищу аналог пробела в юникоде

Вы знали что можно использовать кириллицу при названии переменных в java?

189
JDBC Bath - ERROR Batch entry 295 <unknown> was aborted: Возвращено слишком много результатов обновления. В чем проблема?

JDBC Bath - ERROR Batch entry 295 <unknown> was aborted: Возвращено слишком много результатов обновления. В чем проблема?

Есть много одинаковых запросов insert, и для ускорения выполнения этих процессов, я хочу использовать statementexecuteBatch();

155