在定义之前访问枚举值

Fra*_*ice 4 java enums

如果我有枚举

public enum Days {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
Run Code Online (Sandbox Code Playgroud)

什么是保存值TUESDAY中值的最佳方法MONDAY(例如,在方法Days#nextDay中使用).我本以为MONDAY(TUESDAY)会有效,但我不能这样做,因为TUESDAY还没有定义.是否有解决方法(例如MONDAY(Days.valueOf("TUESDAY")))或我是否需要编写单独的方法?

先感谢您

Psh*_*emo 6

最简单和首选的方法是使用DayOfWeekJava 8中引入的标准类之一.您可以简单地使用其plus(days)方法移动到下一天

DayOfWeek foo = DayOfWeek.MONDAY.plus(1);//TUESDAY
DayOfWeek bar = DayOfWeek.SUNDAY.plus(1);//MONDAY 
Run Code Online (Sandbox Code Playgroud)

但如果您真正的问题是关于其他一些枚举,您可以通过几种方式解决它.


其中一种方法是让每个Enum实例存储其next实例.在已经声明所有枚举值之后,我们可以在静态块中设置它们的值:

enum Days {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;

    static{
        MONDAY.next = TUESDAY;
        TUESDAY.next = WEDNESDAY;
        WEDNESDAY.next = THURSDAY;
        THURSDAY.next = FRIDAY;
        FRIDAY.next = SATURDAY;
        SATURDAY.next = SUNDAY;
        SUNDAY.next = MONDAY;
    }

    private Days next;

    public Days nextDay() {
        return next;
    }

}
Run Code Online (Sandbox Code Playgroud)

MONDAY.nextDay()会回来的TUESDAY.


其他方式可以简单地添加将使用当前枚举的位置来获取下一个元素的方法:

enum Days {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;

    private static final Days[] VALUES = Days.values(); // store result of values()
                                                        // to avoid creating new array
                                                        // each time we use values()
    public Days nextDay() {
        return VALUES[(ordinal() + 1) % 7];
    }

}
Run Code Online (Sandbox Code Playgroud)
  • values() 以声明的顺序返回当前枚举中所有值的数组
  • ordinal() 返回从0开始索引的当前枚举的位置(0-MONDAY,1-TUESDAY,依此类推).