Как уменьшить количество операторов if в приведенном ниже коде в spring -boot.
Значение устанавливается в DTO путем вызова функций в классе обслуживания.
public ResponseEntity<somedTO> fetchAlldata(@RequestParam(value = "meta", required=false)
List<String> meta) {
somedTO response = new somedTO();
//Checks if param present else print complete service
if (meta != null && !meta.isEmpty()) {
if (meta.contains("A")) {
response.setA(service.getA());
}
if (meta.contains("B")) {
response.setB(service.getB());
}
if (meta.contains("C")) {
response.setC(service.getC());
}
if (meta.contains("D")) {
response.setD(service.getD());
}
if (meta.contains("E")) {
response.setE(service.getE());
}
if (meta.contains("F")) {
response.setF(service.getF());
}
if (meta.contains("G")) {
response.setG(service.getG());
}
}
}
как я могу перейти к использованию DTO или Map для уменьшения количества операторов If?
ryt, я хочу проверить на основе параметра, который я хочу установить значения DTO
@venkateshp Это можно было бы сделать с Map, но это потребовало бы гораздо большего количества кода и сделало бы все нечитаемым (= трудно обслуживаемым). Ваше текущее решение намного проще и понятнее для чтения.
Используйте случай переключателя
Но мне нужно сократить операторы If. вероятно, используя карту
просто сделайте это в dto вместо того, чтобы делать это в сервисе
вы можете попробовать использовать отражение.




Вы можете написать так:
if (meta != null && !meta.isEmpty()) {
meta.contains("A") ? response.setA(service.getA()) :
meta.contains("environment") ? response.setB(service.getB()) : XXXXXXXXXXXXXXx;
}
Создайте класс DTO, например somedToDTO В этом классе добавьте все эти строки, которые вы используете
Class somedToDTO{
//Variable here
//Setter, getters
//Condition Check for meta
//hash, toString() etc.
}
Затем в классе обслуживания передайте объект dto, например:
public ResponseEntity<somedTO> fetchAlldata(@Valid @RequestBody somedToDTO metaDto)
{
if (//check for is empty and null)
{
//return dto resposnse after condition check method
}
}
Вот как я кодирую ............
Я бы посоветовал использовать шаблон Цепочка ответственности. Реализуйте набор обработчиков, по одному для каждого оператора if, который у вас есть, чтобы вы обернули каждый из них в класс и определить класс исполнителя, который вызывает все эти обработчики.
Вы можете сделать это с помощью отражения:
List<Field> fields = new ArrayList<>();
somedTO response = new somedTO;
getAllFields(fields,somedTO.class);
fields.stream().filter(field -> meta.contains(field.getName()))
.forEach(field -> {
try{
Field temp = service.getClass().getDeclaredField(field.getName());
temp.setAccessible(true);
field.setAccessible(true);
field.set(response,temp.get(service));
}catch (Exception ex){
}
});
Метод получения списка полей:
public static List<Field> getAllFields(List<Field> fields, Class<?> type) {
fields.addAll(Arrays.asList(type.getDeclaredFields()));
if (type.getSuperclass() != null) {
getAllFields(fields, type.getSuperclass());
}
return fields;
}
Вот пример:
public class Main {
public static void main(String[] args) throws Exception {
List<String> meta = new ArrayList<>();
meta.add("a");
meta.add("c");
A a = new A();
a.setA("a");
a.setB("b");
a.setC("c");
List<Field> fields = new ArrayList<>();
getAllFields(fields,A.class);
B b = new B(); // here you want to copy from a if meta contains
fields.stream().filter(field -> meta.contains(field.getName()))
.forEach(field -> {
try{
Field temp = b.getClass().getDeclaredField(field.getName());
temp.setAccessible(true);
field.setAccessible(true);
temp.set(b,field.get(a));
}catch (Exception ex){
}
});
System.out.println(b.getA());
System.out.println(b.getB());
System.out.println(b.getC());
}
public static List<Field> getAllFields(List<Field> fields, Class<?> type) {
fields.addAll(Arrays.asList(type.getDeclaredFields()));
if (type.getSuperclass() != null) {
getAllFields(fields, type.getSuperclass());
}
return fields;
}
public static class A{
private String a;
private String b;
private String c;
//getter setter
}
public static class B{
private String a;
private String b;
private String c;
//getter setter
}
}
Пример был бы полезен.
чек об оплате. пример добавлен.
что ты имеешь в виду? как вы думаете, помещая код в другой класс, вдруг больше не нужно будет проверять условия?