- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
众所周知,出于很好的理由,不可能扩展枚举。但是,我遇到了一种情况,我需要向来自单独库的已实现枚举的每个值添加一些附加信息,该库在我的控制范围内,但不应包含特定于我正在开发的应用程序的信息片刻。
假设我使用一个提供星期几枚举的库,如下所示:
public enum DayOfWeek {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY;
}
此外部库中的其他类广泛使用此枚举
。
现在假设我们正在编写一个预约安排应用程序,因此我们希望以某种方式将结束时间与 DayOfWeek
的每个值联系起来(如果 DayOfWeek
是在我们的应用程序中,我们可以只添加一个字段和一个构造函数,但这不是这里的一个选项。
DayOfWeek
的实例。最好我应该能够传递一个可以用作 DayOfWeek 但也包含关闭时间的对象。DayOfWeek
中添加或删除一个值(可能是每周 8 天的外星人入侵或其他什么),那么我们的实现应该尽早失败,直到相应的关闭时间添加到我们的库中。最好是在编译时。DayOfWeek
获取关闭时间应该是显而易见的。我对此的最初想法是在辅助方法中使用一个简单的 switch 语句,如下所示:
public static String getClosingTime(DayOfWeek day) {
switch (day) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
return "17:30";
case FRIDAY:
return "16:00";
case SATURDAY:
case SUNDAY:
return "Closed";
default:
return null;
}
}
(为了简单起见,返回值是String
,它们显然应该是现实世界中的某种对象)。
这在第 3 点到第 5 点上成功了,但使用起来很麻烦,因为每次需要关闭时间时都必须调用此方法。
最佳答案
如果您不必直接使用DayOfWeek
,我更喜欢一个接口(interface)(与您的enum DayOfWeek
在同一个package
中),例如
public interface IDayOfWeek {
DayOfWeek getDayOfWeek();
}
并将您的枚举
编辑为
public enum DayOfWeek implements IDayOfWeek {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
@Override
public DayOfWeek getDayOfWeek() {
return this;
}
}
现在您可以创建一个新的枚举
,例如
public enum DayOfWeekAndClosingTime implements IDayOfWeek {
MONDAY(DayOfWeek.MONDAY, "17:30"),
TUESDAY(DayOfWeek.TUESDAY, "17:30"),
WEDNESDAY(DayOfWeek.WEDNESDAY, "17:30"),
THURSDAY(DayOfWeek.THURSDAY, "17:30"),
FRIDAY(DayOfWeek.FRIDAY, "16:00"),
SATURDAY(DayOfWeek.SATURDAY, "Closed"),
SUNDAY(DayOfWeek.SUNDAY, "Closed");
private final DayOfWeek day;
private final String closingTime;
DayOfWeekAndClosingTime(DayOfWeek day, String closingTime) {
this.day = day;
this.closingTime = closingTime;
}
@Override
public DayOfWeek getDayOfWeek() {
return day;
}
public String getClosingTime() {
return closingTime;
}
}
现在您可以将附加信息视为一周中的某一天:
public void handleDayOfWeek(IDayOfWeek day) {
DayOfWeek dayOfWeek = day.getDayOfWeek();
// do something
if (day instanceof DayOfWeekAndClosingTime)
handleClosingTime((DayOfWeekAndClosingTime) day);
}
负点是 DayOfWeek
和 IDayOfWeek
之间的交叉引用
编辑:要检查 DayOfWeek
中的添加值,您可以添加静态 block
static {
if (DayOfWeekAndClosingTime.values().length != DayOfWeek.values().length)
throw new IllegalStateException("missing closing times");
}
您还可以在此处检查包装枚举
的所有天
是否是分离的。
编辑 2:感谢 RobertKock
要获得编译器警告,您可以通过 String
参数减少构造函数并将其更改为
DayOfWeekAndClosingTime(DayOfWeek day) {
this.day = day;
String time = "unknown";
switch(day) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
time = "17:30";
break;
case FRIDAY:
time = "16:00";
break;
case SATURDAY:
case SUNDAY:
time = "closed";
break;
}
this.closingTime = time;
}
关于java - 将附加数据绑定(bind)到枚举的每个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49668496/
我是一名优秀的程序员,十分优秀!