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
。