看一下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 = 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
枚举的第一个元素如何从' 1'开始,有没有办法让我的枚举以' 1'开头。而不是' 0'?
答案 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];
}