2016-02-22 45 views
3

java.time.DayOfWeek源代码纵观透露:Java枚举如何从1开始?

​​

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

这就是为什么我很好奇为什么上面的版本,从1开始。我想知道的另一件事就是为什么F该开始与1而不是与0就像所有其他的枚举做。他们可能已经去了Monday = 0,Tuesday = 1等,但没有!他们改为从Sunday = 0,Monday = 1等转到那里。


不,这不是一个选项

public enum MyDayOfWeek { 

    DUMMY, 

    MONDAY, TUESDAY, // .. 
    ; 
} 

很简单,因为这将是烦人:

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

[摘要]

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

+5

*那么DayOfWeek.MONDAY = 1怎么样?*因为它确实是 –

+0

@NathanHughes如果(DayOfWeek.FOOBARDAY ==天){继续; }' – displayname

+0

这实际上取决于你在哪个国家。在美国,这周的第一天是星期天。因此0和星期一为1.在其他地方,星期的第一天是星期一0.如果您正在使用使用日历的应用程序,则必须允许第一天依赖于位置。 – durbnpoisn

回答

10

为了解决“如何枚举从1开始“?

它没有。

枚举从0开始,他们加1后,返回值:

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

注:在评论他们明确规定:

不要使用序号()来获取数字表示 DayOfWeek。改用getValue()。

+3

更一般地说,Enum.ordinal的文档中提到了“不要调用它,它只是意味着EnumSet和EnumMap“。 –

6

这就是为什么我很好奇为什么上面的版本1

开始根据the code的意见,这是因为他们想追随ISO-8601 week date standard

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


我想知道的另一件事是,为什么这有F到从1开始,而不是与0就像所有其他的枚举做。

它没有。

enum本身是0-索引像任何其他在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]; 
} 
+0

是的,我知道。但是'enum'实际上是以1开始的呢? – displayname

+1

@displayname我已经更新了我的答案,以解释实际上它不是从1开始的。 – azurefrog