在開發中我們經常會碰到有些場景,需要根據某個字段的不同值,去執行不同的邏輯操作,一般我們會傾向於使用 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();
}