在运行时生成新的Enum值

时间:2016-06-22 15:30:19

标签: java enums

假设我有一个这样的枚举:

public enum BlaEnum{
    BLA1,
    BLA2;

    private static final String BLA_ONE = "bla one";
    private static final String BLA_TWO = "bla two";

    public static String getName(BlaEnum bla) {
        switch(bla) {
            case BLA1: return BLA_ONE;
            case BLA2: return BLA_TWO;
            default: return null;
        }
    }

    public static BlaEnum getBla(String bla) {
        switch(naam) {
            case BLA_ONE: return BLA1;
            case BLA_TWO: return BLA2;
            default: //return new enum value via reflection;
        }
    }
}

我如何根据传入的String在运行时返回一个新的Enum值? 好像会声明一个额外的值:

public enum BlaEnum {
    BLA1, BLA2, EXTRA_BLA
...
}

2 个答案:

答案 0 :(得分:2)

你做不到。 Enums are constant

如果您遇到需要在运行时返回新枚举值的情况,那么您应该认真重新考虑您的设计。你可能需要的是一个实际的类,或者像“其他”一样的一些catlell枚举值。

答案 1 :(得分:2)

你不能用枚举来做这件事。正如JLS Sec 8.9中所述:

  

枚举类型没有除其枚举常量定义的实例之外的其他实例。

但是,您可以定义一个界面:

interface SomeInterface {
  // Add methods as required.
}

让你的枚举实现这个界面:

enum BlaEnum implements SomeInterface {
  BLA1, BLA2;
}

以及实现接口的具体类:

class SomeInterfaceImpl implements SomeInterface {
  // ... whatever body
}

让您的getBla(String)方法创建SomeInterfaceImpl I N的实例作为默认情况,例如

default:
  return new SomeInterfaceImpl(bla);

(显然,返回类型必须是SomeInterface,而不是BlaEnum)。

如果您希望在使用相同参数多次调用该方法时返回SomeInterfaceImpl的相同实例,则可能还需要使用某种memoization。