Java枚举如何从1开始?

时间:2016-02-22 18:18:57

标签: java enums

看一下java.time.DayOfWeek的源代码揭示:

public enum DayOfWeek implements TemporalAccessor, TemporalAdjuster {

    /**
     * The singleton instance for the day-of-week of Monday.
     * This has the numeric value of {@code 1}.
     */
    MONDAY,
    /**
     * The singleton instance for the day-of-week of Tuesday.
     * This has the numeric value of {@code 2}.
     */
    TUESDAY,

    // ..
}

那么DayOfWeek.MONDAY = 1怎么样?我问,因为我使用的GWT不支持新的java.time内容(或者永远不会是idk)。所以我做了什么,我制作了自己的版本DayOfWeek但是那个人得到了一个public int getValue() { return ordinal() + 1; }这真的很烦人,因为我每次都要调用它。

这就是为什么我很好奇为什么上面的版本从1开始。另一件我想知道的是为什么这个以1开头而不是0像其他枚举一样。它们本来可以用于Monday = 0Tuesday = 1等,但没有!他们改为从Sunday = 0Monday = 1等转到那里。

不,这不是一个选项

public enum MyDayOfWeek {

    DUMMY,

    MONDAY, TUESDAY, // ..
    ;
}

只是因为这会很烦人:

for(MyDayOfWeek day : MyDayOfWeek.value() {
   if(MyDayOfWeek.DUMMY == day) {
      continue;
   }
}

[摘要]

如果用户定义的枚举始终以第一个元素的值为' 0'那么java.time.DayOfWeek枚举的第一个元素如何从' 1'开始,有没有办法让我的枚举以' 1'开头。而不是' 0'?

2 个答案:

答案 0 :(得分:13)

要解决“enum如何从1开始”?

没有。

枚举以0开头。他们在返回值中加1:

public int getValue() {
    return ordinal() + 1;
}

注意:在评论中他们明确指出:

  

不要使用ordinal()来获取数字表示   DAYOFWEEK。改为使用getValue()。

答案 1 :(得分:6)

这就是为什么我很好奇为什么以上版本以1开头。

根据the code中的评论,这是因为他们想要关注ISO-8601 week date standard

  

DayOfWeek是一个代表一周7天的枚举 - 周一,周二,周三,周四,周五,周六和周日。
  除了文本枚举名称之外,每个星期几还有一个int值。 int值遵循 ISO-8601标准,从1(星期一)到7(星期日)。建议应用程序使用enum而不是int值来确保代码清晰。


我想知道的另一件事是为什么f必须从1开始而不是0,就像其他枚举一样。

没有。

enum本身的索引与Java中的任何其他索引一样。它只是为了给你1-7的价值而摆弄:

public int getValue() {
    return ordinal() + 1;
}

或将1-7变为适当的enum值:

public static DayOfWeek of(int dayOfWeek) {
    if (dayOfWeek < 1 || dayOfWeek > 7) {
        throw new DateTimeException("Invalid value for DayOfWeek: " + dayOfWeek);
    }
    return ENUMS[dayOfWeek - 1];
}