java架构篇之常量管理(枚举定义法) 利用枚举定义常量(架构师入门 初学)

常量的统一定义一直是一个java框架的关键所在,一个好的常量管理更有利于提高程序的开发效率和可维护性,前面讲到了利用接口定义常量(请看我之前的博客“java架构篇之常量管理(接口定义法)”),现在来讲讲利用枚举定义常量。

首先看示例代码

public enum MessageType {
  SYSTEM_MESSAGE(1,"系统消息"),
  COMMENT_MESSAGE(2,"评论消息"),
  COLLECT_MESSAGE(3,"收藏消息");

  private Integer code;
  private String name;
  
  MessageType(Integer code, String name) {
    this.code = code;
    this.name = name;
  }
  public Integer getCode(){
    return code;
  }

  public String getName(){
    return name;
  }
}

其实本质上Enum也是一个类,但与类不同的是,Enum不能被继承,其主要用来定义指定业务概念内的常量,例如消息类型,分为系统消息,评论消息,收藏消息这几种类型。你可能有疑问的地方在这

  SYSTEM_MESSAGE(1,"系统消息"),
  COMMENT_MESSAGE(2,"评论消息"),
  COLLECT_MESSAGE(3,"收藏消息");

其实这段代码等价于(假设MessageType定义成class的情况下)

public class MessageType {

  public static final MessageType SYSTEM_MESSAGE = new MessageType(1, "系统消息");
  public static final MessageType COMMENT_MESSAGE = new MessageType(2, "评论消息");
  public static final MessageType COLLECT_MESSAGE = new MessageType(3, "收藏消息");
  //其他省略
}
怎么样,是不是很熟悉,其实枚举的作用等价于,定义一个类,然后把常量都定义出来。当然,枚举相对于类还有很多优势,在文章结尾的时候会进行总结。

注意:enum不能被new出来,所以我把这里示例换成了Class,Enum一般指定有限个可能的集合,所以不能new出来,不然它本身就代表无限种可能了,不符合enum的初衷。

下面来说说怎么在代码中使用它

    MessageType curType = MessageType.COLLECT_MESSAGE;
    switch (curType){
      case COMMENT_MESSAGE:
        //to do something
        break;
      case SYSTEM_MESSAGE:
        //to do something
        break;
      case COLLECT_MESSAGE:
        //to do something
        break;
    }

直接用switch就能匹配相应的分支。但是有时前台传过来数值可能只是数值,这时候应该怎么办呢,当然你也可以这么写,首先在MessageType里面加一个函数,用来把常量数值转换为相应的枚举类型。

  public static MessageType from(int code){
    for(MessageType cur:MessageType.values()){
      if(cur.getCode() == code){
        return cur;
      }
    }
    return null;
  }

public class EnumTest {

  public static void main(String[] args){
    //常量数值转枚举类型
    MessageType curType = MessageType.from(1) ;
    switch (curType){
      case COMMENT_MESSAGE:
        //to do something
        break;
      case SYSTEM_MESSAGE:
        //to do something
        break;
      case COLLECT_MESSAGE:
        //to do something
        break;
    }
  }
}

重点,枚举相对于利用接口定义常量的优势

1 信息更完善:不仅可以保存常量的值,也可以保存常量对应的解释,以及其他信息,当业务上需要在后台翻译常量含义时用处很大

2 可进行参数校验:可以遍历某个枚举类型下所有可能的值,利用MessageType.values()可以遍历枚举内的常量

场景举例:前台传递消息类型,后台需要判断消息类型是否有效(是否MessageType内有定义),比如前端传递消息类型是4,我需要判断这个类型和[SYSTEM_MESSAGE,COMMENT_MESSAGE,COLLECT_MESSAGE]的Code是否有相等。

注:大型项目中使用自动工具生成枚举类

缺点

前端传递过来的一般是常量数值,需要调用类似于MessageType.from将常量转换到枚举变量。

你可能感兴趣的:(Java)