使用枚举替换 if-else 或 switch

发布时间 2024-01-08 23:58:58作者: Higurashi-kagome

原文:使用枚举替换 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();
}