在java代码中如何对if和else进行优化,尽量不写if判断

20 篇文章 0 订阅
4 篇文章 0 订阅

在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生成的表单效果图
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值