gpt4 book ai didi

java - 将附加数据绑定(bind)到枚举的每个值

转载 作者:行者123 更新时间:2023-11-30 06:04:23 24 4
gpt4 key购买 nike

众所周知,出于很好的理由,不可能扩展枚举。但是,我遇到了一种情况,我需要向来自单独库的已实现枚举的每个值添加一些附加信息,该库在我的控制范围内,但不应包含特定于我正在开发的应用程序的信息片刻。

示例

假设我使用一个提供星期几枚举的​​库,如下所示:

public enum DayOfWeek {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY;
}

此外部库中的其他类广泛使用此枚举

现在假设我们正在编写一个预约安排应用程序,因此我们希望以某种方式将结束时间与 DayOfWeek 的每个值联系起来(如果 DayOfWeek 是在我们的应用程序中,我们可以只添加一个字段和一个构造函数,但这不是这里的一个选项。

重要注意事项

  1. 无论我们选择什么解决方案,其行为都应尽可能类似于 DayOfWeek 的实例。最好我应该能够传递一个可以用作 DayOfWeek 但也包含关闭时间的对象。
  2. 缺失值检测。如果在 DayOfWeek 中添加或删除一个值(可能是每周 8 天的外星人入侵或其他什么),那么我们的实现应该尽早失败,直到相应的关闭时间添加到我们的库中。最好是在编译时。
  3. 易于使用。对于我们应用程序的新开发人员来说,如何从 DayOfWeek 获取关闭时间应该是显而易见的。
  4. 可维护性。对我们的实现进行更改应该尽可能地困难。
  5. 易于开发。这是最不重要的,但一个好的解决方案实现起来应该不会太困难。

我尝试过的

我对此的最初想法是在辅助方法中使用一个简单的 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);
}

负点是 DayOfWeekIDayOfWeek 之间的交叉引用

编辑:要检查 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com