枚举策略如何代替ifelse以及switch语句

前提

手机分为四种状态(关机,休眠,运行,待机)

现拥有五十个实例(五十部手机)

需求

统计各个状态的实例个数

当你需要统计一些不同类型的数量时,或许第一时间想到的是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();
    }

这样,业务代码只需几行即可满足需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值