我有一个枚举如下:
public enum ServerTask {
HOOK_BEFORE_ALL_TASKS("Execute"),
COPY_MASTER_AND_SNAPSHOT_TO_HISTORY("Copy master db"),
PROCESS_CHECKIN_QUEUE("Process Check-In Queue"),
...
}
Run Code Online (Sandbox Code Playgroud)
我还有一个字符串(比如string ="Execute"),我想根据它与之匹配的枚举中的字符串,将其作为ServerTask枚举的实例.有没有比在我想要匹配的字符串和枚举中的每个项目之间进行相等性检查更好的方法呢?因为我的枚举很大,所以看起来这会是很多if语句
在某种程度上,你将不得不迭代你拥有的整个枚举集,并且你必须将它们相等 - 通过映射结构(初始填充)或通过基本循环.
这是很容易用一个基本的循环来完成,所以我看不出有任何理由,你为什么不希望走这条路线.下面的代码片段假定该字段已命名friendlyTask
.
public static ServerTask forTaskName(String friendlyTask) {
for (ServerTask serverTask : ServerTask.values()) {
if(serverTask.friendlyTask.equals(friendlyTask)) {
return serverTask;
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
这种方法的警告是数据不会在内部存储,并且根据您实际拥有的枚举数量以及您想要调用此方法的次数,它的性能会比使用地图初始化稍差.
但是,这种方法最直接.如果你发现自己处于有几百个枚举的位置(甚至超过20个是我的气味),请考虑这些枚举所代表的内容以及应该做些什么来突破它.