关于java:在运行时生成新的Enum值

Generate new Enum value at runtime

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
        }
    }
}

如何根据传入的字符串在运行时返回新的枚举值?就好像声明了一个额外的值:

1
2
3
4
public enum BlaEnum {
    BLA1, BLA2, EXTRA_BLA
...
}


不能对枚举执行此操作。正如JLS第8.9节所述:

An enum type has no instances other than those defined by its enum constants.

但是,您可以定义一个接口:

1
2
3
interface SomeInterface {
  // Add methods as required.
}

并让枚举实现此接口:

1
2
3
enum BlaEnum implements SomeInterface {
  BLA1, BLA2;
}

以及实现接口的具体类:

1
2
3
class SomeInterfaceImpl implements SomeInterface {
  // ... whatever body
}

并让您的getBla(String)方法在缺省情况下创建SomeInterfaceImpl的实例,例如。

1
2
default:
  return new SomeInterfaceImpl(bla);

(显然,返回类型需要是SomeInterface,而不是BlaEnum

如果您希望返回同一个SomeInterfaceImpl实例(如果使用同一参数多次调用该方法),那么也可以使用某种形式的memoization。


不能。枚举是常量。

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