Enum 多态性模式

当一个方法需要接受一组可扩展enum 值时,程序员可以通过创建一个接口来应用像普通 class 这样的多态,这个接口将在任何地方使用 enums:

public interface ExtensibleEnum {
    String name();
}

这样,任何通过(实现)接口标记的 enum 都可以用作参数,允许程序员创建可被方法接受的可变数量的 enums。这可能很有用,例如,在有默认(不可修改)enum 的 API 中,这些 API 的用户希望用更多的值扩展enum

一组默认枚举值可以定义如下:

public enum DefaultValues implements ExtensibleEnum {
    VALUE_ONE, VALUE_TWO;
}

然后可以像这样定义其他值:

public enum ExtendedValues implements ExtensibleEnum {
    VALUE_THREE, VALUE_FOUR;
}

显示如何使用枚举的示例 - 请注意 printEnum() 如何接受来自 enum 类型的值:

private void printEnum(ExtensibleEnum val) {
    System.out.println(val.name());
}  

printEnum(DefaultValues.VALUE_ONE);    // VALUE_ONE
printEnum(DefaultValues.VALUE_TWO);    // VALUE_TWO
printEnum(ExtendedValues.VALUE_THREE); // VALUE_THREE
printEnum(ExtendedValues.VALUE_FOUR);  // VALUE_FOUR

注意:此模式不会阻止你重新定义枚举值,这些枚举值已在一个枚举中定义,在另一个枚举中。这些枚举值将是不同的实例。此外,不可能使用 switch-on-enum,因为我们只有接口,而不是真正的 enum