被自增坑到了...

今天在做枚举类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;

猜你喜欢

转载自blog.csdn.net/czx2018/article/details/82977677