java优化if和switch,使用map代替条件判断
碰到个场景: 传入两个参数,通过对这两个参数的判断,返回一个对应的值。但是这两个参数的种类有很多,所以如果用if或者switch判断的话,代码会很多重复,也会很长,而且if使用过多复杂度太高,打包也不容易通过。
最后决定使用map,用过key值的匹配实现条件判断的效果,传入两个参数进行key匹配,返回对应的value值
优化前:使用switch, 代码客观性比使用if好一些,但是重复代码太多了,逻辑看着也不是很清晰
public static CardTypeCombineCycleTypeEnum combineCardTypeCycleType(CardTypeEnum cardType, CycleTypeEnum cycleType) {
switch (cycleType) {
case WEEK:
break;
case MONTH:
switch (cardType) {
case GOLD:
return GOLD_MONTH;
case NORMAL:
return NORMAL_MONTH;
case ZXK:
return ZXK;
}
break;
case QUARTER:
switch (cardType) {
case NORMAL:
return NORMAL_QUARTER;
case ZXK:
return ZXK;
}
break;
case HALF_YEAR:
switch (cardType) {
case GOLD:
return GOLD_HALF_YEAR;
case NORMAL:
return NORMAL_HALF_YEAR;
case ZXK:
return ZXK;
}
break;
case YEAR:
switch (cardType) {
case GOLD:
return GOLD_YEAR;
case NORMAL:
return NORMAL_YEAR;
case ZXK:
return ZXK;
}
break;
}
return null;
}
优化后:使用map
public static Map<String, CardTypeCombineCycleTypeEnum> combineMap = new HashMap<>();
static {
combineMap.put("WHITE_GOLD", WHITE_GOLD);
combineMap.put("GOLD_MONTH", GOLD_MONTH);
combineMap.put("GOLD_HALF_YEAR", GOLD_HALF_YEAR);
combineMap.put("GOLD_YEAR", GOLD_YEAR);
combineMap.put("PLATINUM", PLATINUM);
combineMap.put("NORMAL_MONTH", NORMAL_MONTH);
combineMap.put("NORMAL_QUARTER", NORMAL_QUARTER);
combineMap.put("NORMAL_HALF_YEAR", NORMAL_HALF_YEAR);
combineMap.put("NORMAL_YEAR", NORMAL_YEAR);
combineMap.put("NEW_VIP", NEW_VIP);
combineMap.put("ZXK", ZXK);
}
public static CardTypeCombineCycleTypeEnum combineCardTypeCycleTypeMap(String cardType, String cycleType) {
return combineMap.get(cardType + "_" + cycleType);
}
测试代码
@Test
public void test_combineCardTypeCycleType() {
CardTypeCombineCycleTypeEnum s = memberUtil.combineCardTypeCycleType(NORMAL, HALF_YEAR);
System.out.println(s.getCode());
System.out.println(s.getDescription());
}
@Test
public void test_combineCardTypeCycleTypeMap() {
CardTypeCombineCycleTypeEnum s = memberUtil.combineCardTypeCycleTypeMap("NORMAL", "HALF_YEAR");
System.out.println(s.getCode());
System.out.println(s.getDescription());
}