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將常量轉換到枚舉變量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章