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 } |
并让您的
1 2 | default: return new SomeInterfaceImpl(bla); |
(显然,返回类型需要是
如果您希望返回同一个
不能。枚举是常量。
如果遇到需要在运行时返回新枚举值的情况,那么应该认真地重新考虑设计。您可能需要的是一个实际的类,或者像"其他"这样的catchall枚举值。