簡潔代碼---巧用枚舉

在業務代碼中,難免會對一些數據進行轉換,最常用的就是將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());//系統錯誤、系統無法識別請求信息
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章