今天在做枚举类demo的时候踩到了一个坑,记录一下。
/**
* 设计一个根据今天是周几,获得明天是周几的程序
*/
public enum WeekDay {
SUN(0),MON(1),TUS(2),WED(3),THU(4),FRI(5),SAT(6);
private int value;
private WeekDay(int value){
this.value = value;
}
public static WeekDay getNextDay(WeekDay nowDay){
int nextValue = ++nowDay.value;
if (nextValue == 7){
nextValue = 0;
}
return getWeekDayByValue(nextValue);
}
public static WeekDay getWeekDayByValue(int value){
for (WeekDay c : WeekDay.values()){
if (c.value == value){
return c;
}
}
return null;
}
}
测试类:
public class Test1 {
public static void main(String[] args) {
System.out.println("nowDay is " + WeekDay.MON);
System.out.println("nowDay int is "+ WeekDay.MON.ordinal());
System.out.println("nextDay is "+ WeekDay.getNextDay(WeekDay.MON));
}
}
启动测试类输出结果居然是:
这结果跟我预想的不一样。。。nextDay应该是TUS才对。。。
于是各种打桩,最后发现原来问题出在这一行:
int nextValue = ++nowDay.value;
当我调用getNextDay()方法,传入参数WeekDay.MON时,经过了自增以后,原来MON对应的value从1变成了2,并且把2赋值给nextValue。然后程序进入getWeekDayByValue(int value)方法时,foreach循环中MON会比TUS先被遍历到,这时的nextValue和MON.value都是2,于是return终止了for循环。最后就返回了MON而不是TUS。解决这个问题的方法也很简单,不要然value自增就好。
int nextValue = nowDay.value+1;