前提:
手機分爲四種狀態(關機,休眠,運行,待機)
現擁有五十個實例(五十部手機)
需求:
統計各個狀態的實例個數
當你需要統計一些不同類型的數量時,你或許第一時間想到的是ifelse或者switch語句,那麼實際應該是這個樣子的。
手機狀態枚舉類:
package hyy.element; public enum PhoneTypeEnum { SHUTDOWN("關機", 0), DORMANCY("休眠", 1), FUNCTION("運行", 2), STANDBY("待機", 3); private String name; private int index; private PhoneTypeEnum(String name, int index) { this.name = name; this.index = index; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } }
用ifelse語句或者switch語句統計各個狀態數量:
public void testEnum() { // 可以自定變量,有多少種狀態,就定義多少變量 int num0 = 0, num1 = 0, num2 = 0, num3 = 0; // 或者定義數據,根據狀態的數量定義 int num[] = new int[PhoneTypeEnum.values().length]; for (int i = 0; i < 50; i++) { Random random = new Random(); int nextInt = random.nextInt(4); //ifelse語句 if (nextInt == PhoneTypeEnum.DORMANCY.getIndex()) { num1++; num[nextInt]++; } else if (nextInt == PhoneTypeEnum.FUNCTION.getIndex()) { num2++; num[nextInt]++; } else if (nextInt == PhoneTypeEnum.SHUTDOWN.getIndex()) { num0++; num[nextInt]++; } else if (nextInt == PhoneTypeEnum.STANDBY.getIndex()) { num3++; num[nextInt]++; } // 或者switch語句 switch (nextInt) { case 0: num0++; num[nextInt]++; break; case 1: num1++; num[nextInt]++; break; case 2: num2++; num[nextInt]++; break; case 3: num3++; num[nextInt]++; break; default: break; } } log.info("num0: " + num0); log.info("num1: " + num1); log.info("num2: " + num2); log.info("num3: " + num3); log.info("numArray: " + Arrays.toString(num)); }
當然這樣並沒有問題,但是當你的業務中不是像我所舉例的手機只有四個狀態,某些複雜的業務中甚至有10個20個甚至更多,那麼此時這樣做就比較爲體力活了。
使用枚舉類代替ifelse或者switch語句
手機狀態枚舉類:
package hyy.element; public enum PhoneTypeEnum { SHUTDOWN("關機", 0), DORMANCY("休眠", 1), FUNCTION("運行", 2), STANDBY("待機", 3); private String name; private int index; private int num; private PhoneTypeEnum(String name, int index) { this.name = name; this.index = index; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } public static String getEnumByIndex(int index) { for (PhoneTypeEnum n : PhoneTypeEnum.values()) { if (n.getIndex() == index) return n.name(); } return null; } public int opNum() { return ++num; } // 此方法在調用業務代碼完成後記得調用,否則下次請求後會累計上一次請求的結果。 public static void clear() { for (PhoneTypeEnum n : PhoneTypeEnum.values()) { n.num = 0; } } }
用枚舉策略統計各個狀態數量:
public void testEnum() { Map<String, Integer> newHashMap = Maps.newHashMap(); for (int i = 0; i < 50; i++) { Random random = new Random(); int nextInt = random.nextInt(4); String enumByIndex = PhoneTypeEnum.getEnumByIndex(nextInt); int opNum = PhoneTypeEnum.valueOf(enumByIndex).opNum(); newHashMap.put(enumByIndex, opNum); } newHashMap.forEach((k, v) -> { log.info(k + "-V: " + v); }); PhoneTypeEnum.clear(); }
這樣,業務代碼只需幾行即可滿足需求。