枚舉策略如何代替ifelse以及switch語句

前提

手機分爲四種狀態(關機,休眠,運行,待機)

現擁有五十個實例(五十部手機)

需求

統計各個狀態的實例個數

當你需要統計一些不同類型的數量時,你或許第一時間想到的是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();
	}

這樣,業務代碼只需幾行即可滿足需求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章