java switch重构

背景

原代码中存在一个switch语句,用于model转VO操作,因为model是抽象类要转成不同的VO,所以用了大量的switch语句

AbstractModel model;  // 抽象模型
String type=model.getType();
 //根据不同类型转换成视图对象
switch(type){
 case "A":
        convertA(model);
case "B":
        convertB(model);
      .......
case "N":
        convertN(model);
}

此类代码可读性较差,而且稍有不慎可能会走到下一个case里面,引发错误

分析解决方法

使用多态、策略模式

  • 定义convert接口和策略实现
    public interface BaseConvert<T extends AbstractModel>{
    VO convert(T model);
    }

public class ConvertA<A>{
VO convert(A model){ ... 省略};
}

  • 调用具体策略
    Map<String,BaseConvert> map=new HashMap(); // map初始化省略
    VO vo=map.get(model.getType()).convert;

  • 这种方法的问题是我必须创建大量的类/匿名类

使用函数式接口Function

  • 定义Convert类
public final class Convert{
   /** 默认map容量*/
    private final static int   INIT_MAPPING_CAPACITY = 32;

    /** type映射VO转换方法*/
    private static final Map<String, Function<AbstractModel, VO>> map;

    /**
     * 初始化mapping
     */
    static {
      map=new  HashMap<>(INIT_MAPPING_CAPACITY);
      // 当类型是A 调用convertA
      map.put("A", (model) ->convertA(model));
      map.put("B", (model) ->convertB(model));
      .......
      map.put("N", (model) ->convertN(model));
    }

   //  声明convertA、convertB 略过

/**
     * model转VO
     * @param model
     * @return  VO
     */
    public static VO dataMappingVO(AbstractModel model) {
        return Optional.ofNullable(map.get(model.getType)).orElse((model) ->  null).apply(model);
    }
}
  • 调用convert
AbstractModel model;  // 抽象模型定义省略
VO vo=Convert.dataMappingVO(model);
  • 此种方式既不用写太多的类,可读性也会更高。

参考:https://codeday.me/bug/20190109/489447.html

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 传送门 解读阿里Java开发手册(v1.1.1) - 异常日志 前言 阿里Java开发手册谈不上圣经,但确实是大量...
    kelgon阅读 4,519评论 4 50
  • 一. Java基础部分.................................................
    wy_sure阅读 4,108评论 0 11
  • 一、编程规约 (一)命名规约 【强制】 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。反...
    喝咖啡的蚂蚁阅读 1,639评论 0 2
  • 对象的创建与销毁 Item 1: 使用static工厂方法,而不是构造函数创建对象:仅仅是创建对象的方法,并非Fa...
    孙小磊阅读 2,201评论 0 3
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 4,629评论 1 14

友情链接更多精彩内容