Как я могу использовать другой DTO, чтобы уменьшить операторы if при загрузке Spring

Как уменьшить количество операторов 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?

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

Stultuske 09.08.2018 12:32

ryt, я хочу проверить на основе параметра, который я хочу установить значения DTO

displayuser 09.08.2018 12:36

@venkateshp Это можно было бы сделать с Map, но это потребовало бы гораздо большего количества кода и сделало бы все нечитаемым (= трудно обслуживаемым). Ваше текущее решение намного проще и понятнее для чтения.

BackSlash 09.08.2018 12:36

Используйте случай переключателя

Sumesh TG 09.08.2018 12:42

Но мне нужно сократить операторы If. вероятно, используя карту

displayuser 09.08.2018 12:52

просто сделайте это в dto вместо того, чтобы делать это в сервисе

Ammar Ali 09.08.2018 13:02

вы можете попробовать использовать отражение.

GolamMazid Sajib 09.08.2018 14:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
747
4

Ответы 4

Вы можете написать так:

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
}
}

Пример был бы полезен.

displayuser 09.08.2018 16:19

чек об оплате. пример добавлен.

GolamMazid Sajib 09.08.2018 16:35

Другие вопросы по теме