如何在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语句?
答案 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
}
}