在java代码中如何对if和else进行优化,尽量不写if判断
1、业务需求说明
根据不同审批类型创建不同类型的表单,本项目共有36个审批类型,所以得写36个判断,
如果后续还要添加审批类型,那就得继续添加if,这样增加了代码的冗余度,那能不能不用写if,
直接根据传入参数,自动调用某种表单的创建方法,这里我采用了反射的技术来实现这一设想,
具体如何实现请看下面代码
2、审批类型说明
approveId:审批类型id
审批类型列表
- 1 化工采购合同审批
- 2 化工采购合同付款审批
- 3 化工采购合同变更审批
- 4 略
3、代码示例如下
@Service
public class ErpApplyFormServiceImpl implements ErpApplyFormService {
@Autowired
private ApplicationContext applicationContext;//通过spring上下文,获取引入的其他服务对象
//引入其他服务对象
@Autowired
private YpSaleContractService ypSaleContractService;
@Autowired
private YpPurContractService ypPurContractService;
//此方法供外部服务调用
@Override
@Transactional(rollbackFor = Exception.class)
public void DetailToForm(String recordId, String approveId, Integer selfApplyId) {
//原始if判断如下
if(approveId.equals("1")){
form1(recordId, approveId, selfApplyId);
}else if(approveId.equals("2")){
form2(recordId, approveId, selfApplyId);
}else if(approveId.equals("3")){
form3(recordId, approveId, selfApplyId);
}
//改进之后如下,上面if判断可以直接省略
insertForm(recordId,approveId,selfApplyId);
}
/**
* @Desc 添加表单
* @Author LRH
* @Date 2021/3/24 14:57
*/
private void insertForm(String recordId, String approveId, Integer selfApplyId){
//设置方法所需的参数
List<Object> args=new ArrayList<>();
args.add(recordId);
args.add(approveId);
args.add(selfApplyId);
try {
//定义要调用的方法名
String functionName="form"+approveId;
//调用反射方法
commonReflectMethod("ErpApplyForm.impl.ErpApplyFormServiceImpl",functionName,args);
} catch (Exception e) {
logger.info("=========================反射执行方法失败!!!!");
e.printStackTrace();
}
}
/**
* 通用反射方法
* @param classUrl 要调用类的全包名
* @param function 要调用的方法名
* @param args 要传递的参数
* @return
* @throws Exception
* @Desc 反射调用类方法
* @Author LRH
* @Date 2021/3/24 13:34
*/
public Object commonReflectMethod(String classUrl,String function,List args) throws Exception{
//获取要操作的类
Class<?> clazz = Class.forName(classUrl);
Object bean = applicationContext.getBean(clazz);//通过spring上下文,获取传进类的对象,并为该对象中的@Autowired标记的类进行注入
//用来存放要调用的参数类型(int,string,......)
Class[] param=null;
//用于存放传参的数据数组
Object[] paramObj=new Object[args.size()];
//如果传递了参数
if(args.size()>0){
param=new Class[args.size()];
//遍历参数集合
for (int i = 0; i < param.length; i++) {
//获取每个类参数的所属的类型
param[i]=args.get(i).getClass();
System.out.println(args.get(i).getClass());
//list转数组
paramObj[i]=args.get(i);
}
Method method=clazz.getMethod(function, param);//根据方法名和参数类型获取该方法对象
method.setAccessible(true); //设置调用方法访问权限
Object obj=method.invoke(bean,paramObj); //反射执行该方法,并传入参数
return obj;
}
return null;
}
//创建表单的具体方法
public void form1(String recordId, String approveId, Integer selfApplyId,ErpApplyForm.ErpApply erpApply)
{
System.out.println("生成化工采购合同审批");
//调用其他服务的方法,此处需注意当前ypSaleContractService服务是否被注入进来
//如果此处的form1方法定义成私有的,那么ypSaleContractService对象是无法被spring动态代理注入的,至于什么原因,有待研究
ypSaleContractService.select();
}
public void form2(String recordId, String approveId, Integer selfApplyId,ErpApplyForm.ErpApply erpApply){略}
public void form3(String recordId, String approveId, Integer selfApplyId,ErpApplyForm.ErpApply erpApply){略}
4、form1生成的表单效果图