我有以下枚举
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
}
}
正如你所看到的,我有不同类型的哺乳动物--“Animal”,“Human”,它们都是枚举。我不想为每个哺乳动物枚举都实现“findMammal”。我想最好的办法是创建一个接受哺乳动物参数并搜索它的实用程序类?也许有一个更简洁的解决方案。
8条答案
按热度按时间ccgok5k51#
你可以使用apache EnumUtils库的getEnum方法。如果找不到,它返回枚举或
null
。vqlkdk9b2#
创建一个
HashMap<String, Mammal>
怎么样?你只需要做一次...注:
null
f5emj3cl3#
如果你不想触及每一个Enum(可以理解),那么实用方法是一个不错的选择。我理解你不想在代码中捕捉异常,但是在方法中捕捉应该没问题:
7tofc5zh4#
你可以使用guava库。Enums类允许:
1aaf6o9v5#
我不明白这个问题,但我还需要一个返回
null
而不是抛出异常的valueOf
,所以我创建了这个实用程序方法:你可以这样称呼它:
4urapxun6#
你的代码中有一个错误。如果你需要你的函数在找不到东西的时候返回null,那么简单地返回它:
如果您犯了同样的错误,却忘记为每一种可能的情况创建一些返回值,那么没有任何技术可以提供帮助。
您的选择:Enum-EnumMaps-HashMap依赖于你的数据的动态性。Enums常量不能在运行时创建。另一方面,你不需要在运行时检查很多东西-编译器会做的。而且你很可能会忘记检查一些东西。Jon Skeet轻松管理的东西可能会让你头疼。
c8ib6hqw7#
如果你能说
你为什么不能说
“CAT”无论如何都必须与枚举名称匹配,在您的示例中,“CAT”不是从参数派生的,而是硬编码的。
更新(可能更接近问题的要点)
有点复杂,但是...
然后你可以打电话
find()的实现看起来可能有所不同(例如,没有抛出异常)。
qacovj5a8#
或
或