常量的統一定義一直是一個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將常量轉換到枚舉變量。