如何在Spring Boot中使用其他DTO减少if语句

时间:2018-08-09 10:26:56

标签: java spring spring-boot

如何在spring-boot中减少以下代码中if语句的数量。

该值是通过调用服务类中的函数在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语句?

4 个答案:

答案 0 :(得分:0)

您可以这样放置:

if (meta != null && !meta.isEmpty()) {
       meta.contains("A") ? response.setA(service.getA()) : 
meta.contains("environment") ? response.setB(service.getB()) : XXXXXXXXXXXXXXx;
}

答案 1 :(得分:0)

创建一个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
     }
}

这就是我的编码方式............

答案 2 :(得分:0)

我建议使用Chain-of-responsibility模式。实现一组处理程序,为您拥有的每个if语句提供一个处理程序,以便将每个处理程序包装在一个类中 定义一个调用所有这些处理程序的执行程序类。

答案 3 :(得分:0)

您可以使用反射来做到这一点:

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