一、情景描述:
1、需将一天的时间分为N段
2、需要判断当前时间属于哪个时间段
3、时间段一般都使用enum来标识
二、问题
1、时间若划分的比较细,就需要写好多if-else来判断
2、每次需要遍历enum
三、开门见山(方案):
1、将enum在静态块中遍历放入Map,得到一个key(小时)- value(对应属于的enum)的Map
2、提供一个静态方法,根据小时获得对应的enum
3、使用switch代替if-else,使代码更明了
四、示例
1、时间划分enum
@Getter
public enum TimeEnum {
FIRST(0, 7, "第一个时间段"),
SECEND(8, 19, "第二个时间段"),
THIRD(20, 23, "第三个时间段"),
;
/** 开始时间 */
private Integer start;
/** 结束时间 */
private Integer end;
/** 时间段说明 */
private String msg;
private static Map<Integer, TimeEnum> TIME_ENUM_MAP = new HashMap<>(24);
static {
for (TimeEnum timeEnum : TimeEnum.values()) {
for (int i = timeEnum.start; i <= timeEnum.end; i++) {
TIME_ENUM_MAP.put(i, timeEnum);
}
}
}
/**
* 根据当前小时获得对应的enum
* @param time 当前小时
* @return 对应的enum
*/
public static TimeEnum getTimeEnumBuyTime(Integer time) {
if (time == null) {
throw new SellException(ResultEnum.TIME_OUT_WISH);
}
TimeEnum timeEnum = TIME_ENUM_MAP.get(time);
if (timeEnum == null) {
throw new SellException(ResultEnum.TIME_OUT_WISH);
}
return timeEnum;
}
TimeEnum(Integer start, Integer end, String msg) {
this.start = start;
this.end = end;
this.msg = msg;
}
}
注:@Getter是使用了lombok,用来生成getter方法的,若未引用lombok,需手动生成getter方法
2、测试并使用
public static void main(String[] args) {
Integer time = 10;
TimeEnum timeEnumBuyTime = TimeEnum.getTimeEnumBuyTime(time);
switch (timeEnumBuyTime) {
case FIRST:
System.out.println(TimeEnum.FIRST.getMsg());
break;
case SECEND:
System.out.println(TimeEnum.SECEND.getMsg());
break;
case THIRD:
System.out.println(TimeEnum.SECEND.getMsg());
break;
default:
System.out.println("不期望的情况");
}
}
out:第二个时间段
如果有哪位有更好的办法请留言告诉一声,多谢(з)-☆
网友评论