限制Enum潜在值的方法

rou*_*ble 6 java oop enums design-patterns

是否可以限制方法可以接受的有效枚举值.

比方说,我有一个这样的枚举:

public enum WEEKDAY {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY;
}
Run Code Online (Sandbox Code Playgroud)

并说我有一个方法只接受这些值的内部集合:

//Here dayOfWeek should only be Monday - Friday.
public void setWorkDayAlarm(WEEKDAY dayOfWeek) {
}
Run Code Online (Sandbox Code Playgroud)

我知道你显然可以打开有效值,在默认情况下不做任何事情.但是在方法的接口中是否有一种方法(或模式),它只接受Java(5+)中有效枚举的某个子集?

pho*_*ser 7

我不知道类型系统可以帮助你.这样的事情怎么样?

public enum DayOfWeek {
    SUNDAY(false), MONDAY(true), TUESDAY(true), WEDNESDAY(true),
    THURSDAY(true), FRIDAY(true), SATURDAY(false);

    private final boolean isWeekday;

    private DayOfWeek(boolean isWeekday) {
        this.isWeekday = isWeekday;
    }

    public boolean isWeekday() {
        return isWeekday;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后检查参数:

public void setWorkDayAlarm(DayOfWeek dayOfWeek) {
    if (!dayOfWeek.isWeekday())
        throw new IllegalArgumentException("Need weekday, got " + dayOfWeek);

    // ...
}
Run Code Online (Sandbox Code Playgroud)