Java優化if-else程式碼幾個解決方案

jeremylai發表於2021-09-15

前言

開發系統一些狀態,比如訂單狀態:資料庫儲存是數字或字母,但是需要顯示中文或英文,一般用到if-else程式碼判斷,但這種判斷可讀性比較差,也會影響後期維護,也比較容易出現bug。比如:
假設狀態對應關係:1:agree 2:refuse 3:finish

int status;
String statusStr = null;
if (status == 1) {
   status = "agree";
} else if (status == 2) {
   status = "refuse";
}else if(status == 3) {
    status = “finish”;
}

方案一: 陣列

這種僅限通過數字獲取到字母或者中文。
首先設定陣列

String[] statusArray = {"","agree","refuse","finish"};

通過陣列的位置獲取陣列的值

int status;
String statusStr =  statusArray[status];

優點: 佔用記憶體少
缺點: 狀態值只能是數字,而且還需要考慮陣列越界情況

方案二:HashMap

建立和新增map:

    private static final Map<Integer,String> map = new HashMap<>();

    static {
        map.put(1,"agree");
        map.put(2,"refuse");
        map.put(3,"finish");
    }

這種有兩種求解方式,通過 key 獲取 value 以及通過 value 獲取 key,

由 key 獲取 value

直接使用 get 方法即可。這裡的key相對於陣列解法,不限制 key 的型別。

int status;
map.get(status);

由 value 獲取 key

使用map遍歷:

int status;
for(Map.Entry<Integer, String> vo : map.entrySet()){
     if (vo.getValue().equals(result)) {
           status = vo.getKey();
           break;
      }
}

優點:狀態值不限制數字
缺點:佔用空間大

解決方案三、列舉

先定義一個列舉類

public enum TestEum {

    agree(1,"agree"),
    refuse(2,"refuse");

    private int code;

    private String capation;

    TestEum(int code,String capation){
        this.code = code;
        this.capation = capation;
    }

    public int getCode() {
        return code;
    }

   public String getCapation() {
        return capation;
   }
  
   String of(int code){
        for (TestEum testEum : TestEum.values()) {
            if (testEum.getCode() == code) {
                return testEum.getCapation();
            }
        }
        return null;
    } 
}

有了列舉以後,if-else 程式碼塊可以優化成一行程式碼

String statusStr = TestEum.of(status);

總結

  1. 如果通過數字獲取描述,使用陣列即可。
  2. 如果通過描述獲取數字,使用列舉和HashMap都可以。

相關文章