Enum 多态性模式
当一个方法需要接受一组可扩展的 enum
值时,程序员可以通过创建一个接口来应用像普通 class
这样的多态,这个接口将在任何地方使用 enum
s:
public interface ExtensibleEnum {
String name();
}
这样,任何通过(实现)接口标记的 enum
都可以用作参数,允许程序员创建可被方法接受的可变数量的 enum
s。这可能很有用,例如,在有默认(不可修改)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
。