Java枚举如何以1开头?

Java枚举如何以1开头?,java,enums,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, /**

查看
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开头。我想知道的另一件事是,为什么f this像其他枚举一样,以1开头,而不是以0开头。他们本可以选择星期一=0,星期二=1等等,但是没有!相反,他们从
Sunday=0
Sunday=1
等切换到了上面的那个东西


不,这不是一个选项

public enum MyDayOfWeek {

    DUMMY,

    MONDAY, TUESDAY, // ..
    ;
}
只是因为这会很烦人:

for(MyDayOfWeek day : MyDayOfWeek.value() {
   if(MyDayOfWeek.DUMMY == day) {
      continue;
   }
}
[摘要]

如果用户定义的枚举总是以值为“0”的第一个元素开头,那么
java.time.DayOfWeek
enum的第一个元素如何以“1”开头,是否有办法让我的枚举以“1”而不是“0”开头?

这就是为什么我想知道上面的版本为什么以1开头

根据中的评论,这是因为他们想遵循:

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


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

没有

enum
本身与Java中的任何其他对象一样,都是0索引的。它只是摆弄数值,给出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];
}
publicstaticdayofweek of(int DayOfWeek){
如果(星期日<1 | |星期日>7){
抛出新的DateTimeException(“DayOfWeek的无效值:“+DayOfWeek”);
}
返回枚举[dayOfWeek-1];
}
以解决“枚举如何从1开始”

没有

枚举以0开头。它们将返回值加1:

public int getValue() {
    return ordinal() + 1;
}
注:在评论中,他们明确指出:

不要使用ordinal()来获取的数值表示形式 星期五。改为使用getValue()


@NathanHughes对增强的for循环很感兴趣
if(DayOfWeek.FOOBARDAY==day){continue;}
这实际上取决于您所在的国家。在美国,一周的第一天是星期天。因此是0,星期一是1。在其他地方,一周的第一天是星期一0。如果你在使用日历的应用程序上工作,你必须考虑到第一天的位置依赖性。@durbnpoison我不认为这是位置依赖性的<代码>枚举始终以0开头。那么他们是如何让这一切从1开始的呢?想象一下,如果它依赖于位置,@displayname您的问题是关于
enum
在Java中如何工作的技术问题吗?或者是关于为什么周一会被分配一个
1
值作为一周的第一天?我怀疑各种评论和回答都是针对某一个问题,因此造成了混乱。请编辑您的问题以澄清。最佳实践:是的,我知道。但是
enum
怎么可能真正以1开头呢?@displayname我更新了我的答案,解释了它实际上是如何不以1开头的。更一般地说,
enum.ordinal
的文档中有这样一句话:“不要调用它,它只适用于EnumSet和EnumMap”。