可能在不自覺時,代碼中就出現了很多的if和else語句,可能像下圖一樣
當然可能沒有這麼誇張,但是我見過比這還誇張的代碼。網上有很多優化if else語句的方法,常用的我就不提了。這次主要是之前看EffectJava時,當時有一張對枚舉講的很是詳細,結合Java8的function接口,感覺這也是優化if else判斷的一個方案。
下面是代碼:
/**
* @author wangli66
*/
public enum DeSensionEnum {
/** 中文名 */
// Function 的 R apply(T t);
CHINESE_NAME("CHINESE_NAME",(str)->{
return str.toString().substring(0,1) + "**";
}),
/** 用戶ID */
USER_ID("USER_ID",(str)->{
return str.toString().substring(0,1) + "**";
}),
/** 身份證號 */
ID_CARD("ID_CARD",(str)->{
return str.toString().substring(0, str.toString().length() - 4) + "****";
}),
private String name;
/*脫敏方式*/
private Function<String,String> deSensive;
/**
* 私有構造器
* @param name
* @param deSensive
*/
private DeSensionEnum(String name,Function deSensive) {
this.name = name;
this.deSensive = deSensive;
}
public String getName() {
return name;
}
/**
* 應用
* @param message
* @return
*/
public String getMsg(String message) {
// 我是爲了演示方便寫到這裏了,實際上你可以在用的地方apply也行
return deSensive.apply(message);
}
}
測試代碼
/**
* @author wangli66
*/
public class TestEnumY {
public static void main(String[] args) {
String name = "ID_CARD";
String id = "3123456789123456";
// 獲取到ID_CARD對應的脫敏方法的枚舉
DeSensionEnum deSensionEnum = DeSensionEnum.valueOf(name);
if(deSensionEnum != null) {
// 脫敏
String msg = deSensionEnum.getMsg(id);
System.out.println("脫敏後的數據:"+msg);
}
}
}
// 結果
// 脫敏後的數據:312345678912****
另外不得不說的是:
// 即使以後你又增加了其他的脫敏數據類型,我直接加下枚舉,並實現下脫敏方法就行了,
// 主體的代碼邏輯根本不需要去改變。
// 枚舉的類型限制挺好的,能保證你傳參正確性,要麼枚舉類型,要麼null,也能減少不必要的判斷代碼。
看到這裏,聰明的同學你可能靈光一閃。
搞什麼啊,這不就是KV鍵值對嘛,我大map肯定也能這麼做,是的,你猜對了。
// 和使用枚舉的原理一樣,key使用方法名,value使用接口,也可以達到這種效果。
// 下面上代碼
/**
* @author wangli66
*/
public class TestEnumMap {
public static void main(String[] args) {
// 初始化map
Map<String, Function<String,String>> functionMap = new HashMap<>();
functionMap.put("CHINESE_NAME",(str)->{
return str.toString().substring(0,1) + "**";});
functionMap.put("USER_ID",(str)->{
return str.toString().substring(0,1) + "**";});
functionMap.put("ID_CARD",(str)->{
return str.toString().substring(0, str.toString().length() - 4) + "****";});
// 測試
String name = "ID_CARD";
String id = "3123456789123456";
// 拿到對應的方法,進行應用
Function<String, String> function = functionMap.get(name);
String msg = function.apply(id);
System.out.println("脫敏後的數據:"+msg);
}
}
// 結果
// 脫敏後的數據:312345678912****
不管是用哪一種方式,能夠優化代碼就可以了。使用Map這種方式時建議做成全局的。
歡迎指正,以及跪求三連一波!!!