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