Java – use ‘valueof’ to retrieve an enumerated throws runtimeException – what is used?

I have the following enumeration

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;
         }
      }
   }
}

I initially used enum valueOf(Animal.class,“DOG”); Find a specific animal However, I didn't know that if no match was found, an illegalargumentexception would be thrown I thought maybe a null was returned So this gives me a question If no match is found, I don't want to catch this illegalargumentexception I want to be able to search all enumerations of type mammal. I don't want to implement this static "findmammal" for every enumeration of type mammal So my question is, what is the most auspicious design decision to perform this behavior? I will have this calling code:

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
   }
}

As you can see, I have different types of mammals - "animals", "people", they are enumerations I don't want to implement "findmammal" for every mammal enumeration I think the best bet is just to create a utility class that requires a mammalian parameter and search? Perhaps there is a more complete solution

Solution

How to create HashMap < string, MMAL >? You only need to do it once

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);
  }
}

Notes:

>If the name does not exist, return null > this will not find name conflicts > you may want to use some immutable maps (for example, through guava) > you may want to write a utility method to create an immutable name to the map for ordinary enumeration, and then just merge the map:)

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>