java switch重構(gòu)

背景

原代碼中存在一個(gè)switch語(yǔ)句,用于model轉(zhuǎn)VO操作,因?yàn)閙odel是抽象類要轉(zhuǎn)成不同的VO,所以用了大量的switch語(yǔ)句

AbstractModel model;  // 抽象模型
String type=model.getType();
 //根據(jù)不同類型轉(zhuǎn)換成視圖對(duì)象
switch(type){
 case "A":
        convertA(model);
case "B":
        convertB(model);
      .......
case "N":
        convertN(model);
}

此類代碼可讀性較差,而且稍有不慎可能會(huì)走到下一個(gè)case里面,引發(fā)錯(cuò)誤

分析解決方法

使用多態(tài)、策略模式

  • 定義convert接口和策略實(shí)現(xiàn)
    public interface BaseConvert<T extends AbstractModel>{
    VO convert(T model);
    }

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

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

  • 這種方法的問題是我必須創(chuàng)建大量的類/匿名類

使用函數(shù)式接口Function

  • 定義Convert類
public final class Convert{
   /** 默認(rèn)map容量*/
    private final static int   INIT_MAPPING_CAPACITY = 32;

    /** type映射VO轉(zhuǎn)換方法*/
    private static final Map<String, Function<AbstractModel, VO>> map;

    /**
     * 初始化mapping
     */
    static {
      map=new  HashMap<>(INIT_MAPPING_CAPACITY);
      // 當(dāng)類型是A 調(diào)用convertA
      map.put("A", (model) ->convertA(model));
      map.put("B", (model) ->convertB(model));
      .......
      map.put("N", (model) ->convertN(model));
    }

   //  聲明convertA、convertB 略過

/**
     * model轉(zhuǎn)VO
     * @param model
     * @return  VO
     */
    public static VO dataMappingVO(AbstractModel model) {
        return Optional.ofNullable(map.get(model.getType)).orElse((model) ->  null).apply(model);
    }
}
  • 調(diào)用convert
AbstractModel model;  // 抽象模型定義省略
VO vo=Convert.dataMappingVO(model);
  • 此種方式既不用寫太多的類,可讀性也會(huì)更高。

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 傳送門 解讀阿里Java開發(fā)手冊(cè)(v1.1.1) - 異常日志 前言 阿里Java開發(fā)手冊(cè)談不上圣經(jīng),但確實(shí)是大量...
    kelgon閱讀 4,463評(píng)論 4 50
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 4,011評(píng)論 0 11
  • 一、編程規(guī)約 (一)命名規(guī)約 【強(qiáng)制】 代碼中的命名均不能以下劃線或美元符號(hào)開始,也不能以下劃線或美元符號(hào)結(jié)束。反...
    喝咖啡的螞蟻閱讀 1,605評(píng)論 0 2
  • 對(duì)象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法,而不是構(gòu)造函數(shù)創(chuàng)建對(duì)象:僅僅是創(chuàng)建對(duì)象的方法,并非Fa...
    孫小磊閱讀 2,184評(píng)論 0 3
  • 在一個(gè)方法內(nèi)部定義的變量都存儲(chǔ)在棧中,當(dāng)這個(gè)函數(shù)運(yùn)行結(jié)束后,其對(duì)應(yīng)的棧就會(huì)被回收,此時(shí),在其方法體中定義的變量將不...
    Y了個(gè)J閱讀 4,573評(píng)論 1 14

友情鏈接更多精彩內(nèi)容