微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 使用’valueOf’检索一个枚举throws RuntimeException – 使用什么?

我有以下枚举
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)>您可能希望编写一个实用程序方法来为普通枚举创建一个不可变的名称到地图,然后只是合并地图:)

原文地址:https://www.jb51.cc/java/123549.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐