Задача - приходит два обьекта "старый" и "новый" вариант. Необходимо сравнить их поля и если они одинаковы - засетить в поле 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;
}
оригинал - 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);
}
}
тут сложно что-то сократить не видя остальной части кода
Вы вполне можете использовать рефлексию, вызывая как методы так и поля объекта например по их названию, и передавая их параметрами в нужный метод. Это позволит рефакторить ваш код и вынести повторяющиеся блоки в отдельные методы.
// выносим в отдельный метод запись в поля объекта 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;
}
Не забудьте обработать исключения.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Использую MySQL 8 на ОС Windows 10версия коннектора 8
Вы знали что можно использовать кириллицу при названии переменных в java?
Есть много одинаковых запросов insert, и для ускорения выполнения этих процессов, я хочу использовать statementexecuteBatch();