在業務代碼中,難免會對一些數據進行轉換,最常用的就是將code碼轉成value值。
這裏使用一個簡單的demo,
例1:將性別代碼轉爲中文字符串(0:男,1:女):
最簡單的方法就是使用if
去判斷
public static void main(String[] args) {
Integer sexCode = 0;
String sexValue = "未知類型";
if (sexCode == 0) {
sexValue = "男";
}else if (sexCode == 1) {
sexValue = "女";
}
System.out.println(sexValue);
}
雖然上面這段代碼通俗易懂,小白都能操起鍵盤就是幹,但是這樣的代碼摻雜在我們的業務代碼裏面,似乎看起來不太簡潔,因爲一個字段值的轉換 我們要寫這麼多行。本來業務代碼可能不太複雜,因爲這些判斷,代碼顯得很臃腫了,業務分析時一個不小心,就可能漏掉某種情況。這裏狀態值只有兩種,我們使用一個if else if
就搞定了,如果類型很多的話,那麼我們就要在後面追加各種else if
了。
那麼如果使用枚舉的話,代碼會變得怎麼樣了呢?
首先我們需要定義一個枚舉類,裏面包含我們可預知的各種正常情況
和一種非正常情況
。
public enum SexEnum {
MAN(0,"男"),
WOMAN(1,"女"),
OTHER(2,"未知類型");
private static HashMap<Integer,SexEnum> enumKey = new HashMap<Integer,SexEnum>();
static {
for (SexEnum valueEnum : SexEnum.values()) {
enumKey.put(valueEnum.getCode(), valueEnum);
}
}
private Integer code;
private String value;
private SexEnum(Integer code, String value) {
this.code = code;
this.value = value;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public static String getSex(Integer sexCode) {
SexEnum sexEnum = enumKey.get(sexCode);
if (sexEnum == null) {
return OTHER.getValue();
}
return sexEnum.getValue();
}
}
這樣在進行key-value
轉換的時候,直接調用枚舉類中的getSex(Integer sexCode)
方法即可。
public static void main(String[] args) {
Integer sexCode = 0;
String sexValue = SexEnum.getSex(sexCode);
System.out.println(sexValue); // 男
sexCode = 1;
sexValue = SexEnum.getSex(sexCode);
System.out.println(sexValue); // 女
sexCode = 2;
sexValue = SexEnum.getSex(sexCode);
System.out.println(sexValue); // 未知類型
sexCode = 3;
sexValue = SexEnum.getSex(sexCode);
System.out.println(sexValue); // 未知類型
sexCode = null;
sexValue = SexEnum.getSex(sexCode);
System.out.println(sexValue); // 未知類型
}
可以看到,使用枚舉時,key-value
轉換在業務層我們僅僅需要一行代碼即可,並且我們在最後添加了默認值
,也就是出現非正常數據時,直接返回我們的默認值即可,這樣可以避免僅僅因爲一個key-value
轉換導致我們的程序出現bug。其中枚舉類的擴展也是十分方便的,我們直接在枚舉類裏面添加對應的Value
即可。
上面是一對一
的情況,下面我們稍微擴展一點,添加一個多對一
的情況。
例2:當code返回0或者1的時候,我們當成正常的數據,返回true,否則返回false。
public enum SexEnum {
MAN(0,"男"),
WOMAN(1,"女"),
OTHER(2,"未知類型");
private static HashMap<Integer,SexEnum> enumKey = new HashMap<Integer,SexEnum>();
private static TreeSet<Integer> codeSet = new TreeSet<Integer>();
static {
for (SexEnum valueEnum : SexEnum.values()) {
enumKey.put(valueEnum.getCode(), valueEnum);
if (valueEnum != OTHER) {
codeSet.add(valueEnum.getCode());
}
}
}
private Integer code;
private String value;
private SexEnum(Integer code, String value) {
this.code = code;
this.value = value;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public static String getSex(Integer sexCode) {
SexEnum sexEnum = enumKey.get(sexCode);
if (sexEnum == null) {
return OTHER.getValue();
}
return sexEnum.getValue();
}
public static boolean checkCode(Integer sexCode) {
if (sexCode == null) {
return false;
}
return codeSet.contains(sexCode);
}
}
首先我們定義一個用來接收正常情況的codeSet
,初始化時先將正常情況放進前面定義的codeSet
,然後添加判斷的方法checkCode
:
public static void main(String[] args) {
Integer sexCode = 0;
boolean checkCode = SexEnum.checkCode(sexCode);
System.out.println(checkCode); // true
sexCode = 1;
checkCode = SexEnum.checkCode(sexCode);
System.out.println(checkCode); // true
sexCode = 2;
checkCode = SexEnum.checkCode(sexCode);
System.out.println(checkCode); // false
sexCode = 3;
checkCode = SexEnum.checkCode(sexCode);
System.out.println(checkCode); // false
sexCode = null;
checkCode = SexEnum.checkCode(sexCode);
System.out.println(checkCode); // false
}
上面我們看了使用枚舉解決一對一
,多對一
的情況,但是遇到一對多
的情況會是怎樣的呢?枚舉當然也是可以處理的。
例3:當我們收到上游接口的狀態碼爲0時表示正常,提示信息爲“調用成功”,其他狀態碼爲異常,但是我們這邊使用的正常結果的code碼是200,提示信息爲“success”,對於上游的異常狀態碼我們進行統一封裝,返回999,提示“系統錯誤、系統無法識別請求信息”,這就需要我們對拿到的結果進行轉換然後儲存了。
import java.util.HashMap;
import java.util.TreeSet;
public enum OneToMoreEnum {
/**
* 查詢成功
*/
QUERY_SUCCESS ("0","200","success"),
/**
* 系統錯誤、系統無法識別請求信息
*/
QUERY_FAIL("99999999","999","系統錯誤、系統無法識別請求信息");
private static HashMap<String,OneToMoreEnum> extKey = new HashMap<String,OneToMoreEnum>();
private static TreeSet<String> isSuccess = new TreeSet<String>();
private String ext_key;
private String in_key;
private String msg;
static {
for (OneToMoreEnum p : OneToMoreEnum.values()) {
OneToMoreEnum.extKey.put(p.ext_key, p);
if(p != QUERY_FAIL) {
isSuccess.add(p.ext_key);
}
}
}
public static boolean isSuccess(String extKey) {
if (StringUtils.isBlank(extKey)) {
return false;
}
return isSuccess.contains(extKey);
}
public static OneToMoreEnum getExtKey(String ext_key) {
if (StringUtils.isBlank(ext_key)) {
return OneToMoreEnum.QUERY_FAIL;
}
OneToMoreEnum oneToMoreEnum = extKey.get(ext_key);
if(oneToMoreEnum == null) {
return OneToMoreEnum.QUERY_FAIL;
}
return oneToMoreEnum;
}
private OneToMoreEnum(String ext_key,String in_key,String msg) {
this.setExt_key(ext_key);
this.setIn_key(in_key);
this.setMsg(msg);
}
public String getExt_key() {
return ext_key;
}
public void setExt_key(String ext_key) {
this.ext_key = ext_key;
}
public String getIn_key() {
return in_key;
}
public void setIn_key(String in_key) {
this.in_key = in_key;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
public static void main(String[] args) {
String extKey = "0";
boolean success = OneToMoreEnum.isSuccess(extKey);
System.out.println(success); // true
extKey = "999";
success = OneToMoreEnum.isSuccess(extKey);
System.out.println(success); // false
extKey = "404";
success = OneToMoreEnum.isSuccess(extKey);
System.out.println(success); // false
OneToMoreEnum extKey = OneToMoreEnum.getExtKey(ext_Key);
System.out.println(extKey.getIn_key()); //999
System.out.println(extKey.getMsg());//系統錯誤、系統無法識別請求信息
}