在开发中我们经常会碰到有些场景,需要根据某个字段的不同值,去执行不同的逻辑操作,一般我们会倾向于使用 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();
}