Java枚举反向查找
因此,我有一个枚举,它不能像我预期的那样工作,需要进行一些修改:
public enum MyEnum {
CODE000("text description comes here"),
private final String value;
private static final Map<String, MyEnum> LOOKUP = Maps.uniqueIndex(
Arrays.asList(MyEnum.values()),
MyEnum::getValue
);
MyEnum(final String value) {
this.value = value;
}
public String getValue() {
return value;
}
public static MyEnum fromStatus(String status) {
return LOOKUP.get(status);
}
}
它现在的工作方式是:
MyEnum.fromStatus("text description comes here")
当然,我想换一种方式:
MyEnum.fromStatus("CODE000")
返回我"text description comes here"
有人能建议我如何改变这一点吗
# 1 楼答案
您的键函数(
MyEnum::getValue
)返回的值错误。 它必须是MyEnum::name
这将返回枚举而不是文本描述,因为映射的值的类型为
MyEnum
。可以通过调用枚举上的getValue
来获取文本值,也可以将值存储在映射中而不是枚举中# 2 楼答案
到目前为止,答案是使用方法
valueOf
。只要提供枚举常量的名称,此方法将返回枚举常量。否则将抛出一个IllegalArgumentException
在您的问题中,您使用的是查找地图。映射(看起来像是由Guava
Maps
创建的)将返回非枚举常量名称null
。在这种情况下,它不会抛出IllegalArgumentException
。因此,这是一种不同的行为此外,你说:“当然我想换个方式”
这意味着您希望按状态获取枚举,并按枚举名称获取状态
因此,您需要有两种查找方法:
但是,如果您定义了您提到的两种方法,则会出现编译时错误:
编译器无法按名称和参数区分方法。但是,即使您编写了
MyEnum.fromStatus("CODE000")
,实际上它是您用作参数的枚举常量名。因此,让我们通过调用第二个方法fromName
来解决命名冲突。MyEnum
的代码可能如下所示:如果要以相同的方式按名称查找枚举常量(非枚举常量名称无例外),则需要第三个映射和第三个查找方法:
这项工作如下:
如果您需要
byName
方法,我建议将方法fromName
重命名为类似statusByName
的名称,以保持它们之间的可理解性最后还有一个建议:
由于查找方法可能返回
null
,因此我们可以返回Optional<String>
/Optional<MyEnum>
。这将允许立即继续处理结果# 3 楼答案
如果要通过枚举名称获取枚举值,可以使用以下函数:
# 4 楼答案
您需要的是一个文本查找,通过调用
valueOf
获得:然后:
请注意,如果传递给
valueOf
的字符串未解析为MyEnum
中的枚举文字,将引发异常