假设我有一个这样的枚举:
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
...
}
答案 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。