我有以下枚举
enum Animal implements Mammal { CAT,DOG; public static Mammal findMammal(final String type) { for (Animal a : Animal.values()) { if (a.name().equals(type)) { return a; } } } }
我最初使用了Enum.valueOf(Animal.class,“DOG”);找到一个特定的动物.但是,我不知道如果没有找到匹配项,则会抛出一个IllegalArgumentException异常.我以为可能是一个null被返回.所以这给我一个问题.如果没有找到匹配,我不想抓住这个IllegalArgumentException.我想能够搜索Mammal类型的所有枚举,我不想为每个类型为Mammal的枚举实现这个静态“findMammal”.所以我的问题是,执行这个行为的最吉利的设计决定是什么?我会有这样的调用代码:
public class Foo { public Mammal bar(final String arg) { Mammal m = null; if (arg.equals("SomeValue")) { m = Animal.findMammal("CAT"); } else if (arg.equals("AnotherValue") { m = Human.findMammal("BILL"); } // ... etc } }
你可以看到,我有不同类型的哺乳动物 – “动物”,“人”,它们是枚举.我不想为每个Mammal枚举实现“findMammal”.我想最好的打赌只是创建一个实用程序类,它需要一个哺乳动物的参数,并搜索?也许有一个更完整的解决方案.
解决方法
如何创建HashMap< String,Mammal>?你只需要做一次…
public class Foo { private static final Map<String,Mammal> NAME_TO_MAMMAL_MAP; static { NAME_TO_MAMMAL_MAP = new HashMap<String,Mammal>(); for (Human human : EnumSet.allOf(Human.class)) { NAME_TO_MAMMAL_MAP.put(human.name(),human); } for (Animal animal : EnumSet.allOf(Animal.class)) { NAME_TO_MAMMAL_MAP.put(animal.name(),animal); } } public static Mammal bar(final String arg) { return NAME_TO_MAMMAL_MAP.get(arg); } }
笔记:
>如果名称不存在,则返回null
>这不会发现名称冲突
>您可能想使用一些不可变的地图(例如通过Guava)>您可能希望编写一个实用程序方法来为普通枚举创建一个不可变的名称到地图,然后只是合并地图:)