使用枚舉替換 if-else 或 switch

原文:使用枚舉替換 if/else/switch

在開發中我們經常會碰到有些場景,需要根據某個字段的不同值,去執行不同的邏輯操作,一般我們會傾向於使用 if/else 或者 switch/case 的方式,但當字段的不同值不斷增加,或者各種不同值都需要執行非常多邏輯的時候,使用 if/else/switch 會使代碼不易維護,且可讀性差。這時候可以嘗試使用枚舉重構。

舉例:當不同角色去審批員工請假單時,執行的邏輯是不一樣的。如果使用 if/else 的方式,我們的代碼會是如下這樣:

public void judge(Long applyId, String role){
    if (role.equals("leader")) {
        // leader doing
    } else if (role.equals("service owner")) {
        // service owner doing
    } else if (role.equals("project manager")) {
        // project manager doing
    } else if (role.equals("supervisor")) {
        // supervisor doing
    } ...
}

後續如果再增加人物角色,會不斷增多 if/else,非常不利於擴展和維護。

接下來我們使用 Java 枚舉的方式改造一下。首先定義一個公用接口:

public interface RoleService {
    //審批操作,後續增加其他操作只需要再新建方法
	void approve();
}

接下來我們定義一個不同角色執行不同邏輯的枚舉類 RoleServiceEnum 來實現接口,將不同角色的邏輯全部交由這個枚舉類來做:

public enum RoleServiceEnum implements RoleService {
  ROLE_LEADER(){
      @Override
      public void approve() {
          System.out.println("leader doing sth");
      }
  }
  ROLE_SERVICE_OWNER(){
      @Override
      public void approve() {
          System.out.println("so doing sth");
      }
  },
  ROLE_PROJECT_MANAGER(){
      @Override
      public void approve() {
          System.out.println("pm doing sth");
      }
  },
  ROLE_SUPERVISOR(){
      @Override
      public void approve() {
          System.out.println("supervisor doing sth");
      }
  };
}

接下來我們再調用這個枚舉類,執行不同角色審批請假單的邏輯,一行代碼就行了:

public void judge(String role){
    RoleServiceEnum.valueOf(role).approve();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章