Java 从表示某些工作日的枚举中获取枚举值的好方法是什么
我有一个Java 从表示某些工作日的枚举中获取枚举值的好方法是什么,java,Java,我有一个ENUM,只有3个常量。根据名为weekend的标志,ENUM.values()应返回3或2个常量 public enum Weekday { SUNDAY, MONDAY, TUESDAY; } public Weekday[] getDays() { boolean weekend = true; if (weekend){ return Weekday.values() // this will reurn SUNDAY, MONDAY,
ENUM
,只有3个常量。根据名为weekend
的标志,ENUM.values()应返回3或2个常量
public enum Weekday {
SUNDAY, MONDAY, TUESDAY;
}
public Weekday[] getDays() {
boolean weekend = true;
if (weekend){
return Weekday.values() // this will reurn SUNDAY, MONDAY, TUESDAY
} else { // when weekend is false
return Weekday.values() // it should return on MONDAY, TUESDAY
}
}
请建议,实现这一目标的合理方法是什么。我能够实现它与下面的代码。不幸的是,公关审查员对此似乎并不高兴。你能建议一个更好的方法吗
我的解决方案
EnumMap<Weekday, Integer> days= new EnumMap<>(Weekday.class);
days.put(Weekday.MONDAY, 1);
days.put(Weekday.TUESDAY, 2);
return days.keySet().toArray(new Weekday[0]); // this returns MONDAY and TUESDAY.
EnumMap days=新的EnumMap(Weekday.class);
天。放置(工作日。星期一,1);
天。放置(工作日。星期二,2);
return days.keySet().toArray(新的工作日[0]);//星期一和星期二返回。
那么:
public enum Weekday {
SUNDAY, MONDAY, TUESDAY;
}
public Weekday[] getDays() {
boolean weekend = callFromSomeAPI();
return weekend ? Weekday.values() : new Weekday[] {Weekday.MONDAY, Weekday.TUESDAY};
}
当然,在Enum工作日的更典型用法中
将表示一周中的所有7天,并使用变量(例如,周末
或工作日
)来区分周日和周末。比如:
enum Weekday {
MONDAY(false),
TUESDAY(false),
WEDNESDAY(false),
THURSDAY(false),
FRIDAY(false),
SATURDAY(true),
SUNDAY(true);
private final boolean weekend;
Weekday(boolean weekend) {
this.weekend = weekend;
}
public static Weekday[] getDays(boolean weekend) {
return Arrays.stream(values()).filter(i -> i.weekend == weekend).toArray(Weekday[]::new);
}
}
答案是正确的。我要补充几点
DayOfWeek
Java在Java.time包中提供您的枚举:
无需为此目的在此处定义自己的枚举
不可修改的列表
您可以使用方便的方法返回列表,而不是数组
……还有
public List< DayOfWeek > getDays() {
boolean weekend = callFromSomeAPI();
return weekend ? WEEKEND : FIRST_WEEKDAYS ;
}
EnumSet
该类提供了类似的方法,但:
- 是可修改的
- 对于保存枚举对象进行了高度优化,可以快速
在占用很少内存的情况下执行
EnumSet
迭代器按枚举定义的顺序返回枚举。在DayOfWeek
中,按照标准,顺序为周一至周日。因此,如果你认为星期天是第一天,这种方法可能不适用(如果是这样,请坚持使用列表)
SetgetDays(字符串标志)
{
if(flag.equalsIgnoreCase(“weekend”)//最好使用枚举作为标记,而不是容易出错的字符串。
{
返回EnumSet.of(DayOfWeek.SUNDAY,DayOfWeek.MONDAY,DayOfWeek.周二));//请注意:此枚举集将按星期一-星期二-星期日顺序迭代,即它们在枚举中的定义顺序。
}否则
{
返回EnumSet.of(DayOfWeek.MONDAY,DayOfWeek.周二));
}
}
@dreamcrash我觉得你的代码不错。我会试试这个,看看它是否能让评论满意:)谢谢
static final List< DayOfWeek > WEEKEND = List.of( DayOfWeek.SUNDAY , DayOfWeek.MONDAY , DayOfWeek.TUESDAY ) ;
static final List< DayOfWeek > FIRST_WEEKDAYS = List.of( DayOfWeek.MONDAY , DayOfWeek.TUESDAY ) ;
public List< DayOfWeek > getDays() {
boolean weekend = callFromSomeAPI();
return weekend ? WEEKEND : FIRST_WEEKDAYS ;
}
… whatever.getDays().toArray( new DayOfWeek[0] ) …
Set< DayOfWeek > getDays( String flag )
{
if ( flag.equalsIgnoreCase( "weekend" ) ) // Better to use an enum as your flag rather than error-prone strings.
{
return EnumSet.of( DayOfWeek.SUNDAY , DayOfWeek.MONDAY , DayOfWeek.TUESDAY ) ) ; // Be aware: This EnumSet will iterate in Monday-Tuesday-Sunday order, the order of their definition in the Enum.
} else
{
return EnumSet.of( DayOfWeek.MONDAY , DayOfWeek.TUESDAY ) ) ;
}
}