前提:
手机分为四种状态(关机,休眠,运行,待机)
现拥有五十个实例(五十部手机)
需求:
统计各个状态的实例个数
当你需要统计一些不同类型的数量时,或许第一时间想到的是ifelse或者switch语句,那么实际应该是这个样子的。
手机状态枚举类:
public enum PhoneTypeEnum { SHUTDOWN("关机", 8393920), DORMANCY("休眠", 8393921), FUNCTION("运行", 8393922), STANDBY("待机", 8393923); 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 test() { // 可以自定义变量,有多少种状态,就定义多少变量 int shutdown = 0, dormancy = 0, function = 0, standby = 0; Random random = new Random(); //ifelse语句 for (int i = 0; i < 50; i++) { int nextInt = random.nextInt(4) + 8393920; if (nextInt == PhoneTypeEnum.SHUTDOWN.getIndex()) { shutdown++; } else if (nextInt == PhoneTypeEnum.DORMANCY.getIndex()) { dormancy++; } else if (nextInt == PhoneTypeEnum.FUNCTION.getIndex()) { function++; } else if (nextInt == PhoneTypeEnum.STANDBY.getIndex()) { standby++; } } // 或者switch语句 for (int i = 0; i < 50; i++) { int nextInt = random.nextInt(4) + 8393920; switch (nextInt) { case 8393920: shutdown++; break; case 8393921: dormancy++; break; case 8393922: function++; break; case 8393923: standby++; break; default: break; } } log.info("shutdown: " + shutdown); log.info("dormancy: " + dormancy); log.info("function: " + function); log.info("standby: " + standby); }
当然这样并没有问题,但是当你的业务中不是像我所举例的手机只有四个状态,某些复杂的业务中甚至有10个20个甚至更多,那么此时这样做就比较为体力活了。
使用枚举类代替ifelse或者switch语句
手机状态枚举类:
package hyy.element; public enum PhoneTypeEnum { SHUTDOWN("关机", 8393920), DORMANCY("休眠", 8393921), FUNCTION("运行", 8393922), STANDBY("待机", 8393923); 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 = new HashMap<>(); Random random = new Random(); for (int i = 0; i < 50; i++) { int nextInt = random.nextInt(4) + 8393920; 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(); }
这样,业务代码只需几行即可满足需求。