java優化if和switch,使用map代替條件判斷
阿新 • • 發佈:2022-04-13
碰到個場景: 傳入兩個引數,通過對這兩個引數的判斷,返回一個對應的值。但是這兩個引數的種類有很多,所以如果用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()); }