views:

21857

answers:

5

Say I have an enum which is just

public enum Blah {
  A, B , C, D
}

and I would like to find the enum value of a string of for example "A" which would be Blah.A. How would it be possible to do this?

Is the Enum.ValueOf() the method I need? If so, how would I use this?

+37  A: 

Yes, Blah.valueOf("A") will give you Blah.A.

The static methods valueOf() and values() are created at compile time and do not appear in source code. They do appear in Javadoc, though; for example, Dialog.ModalityType shows both methods.

Michael Myers
+5  A: 

You should also be careful with your case. Let me explain: doing Blah.valueOf("A") works, but Blah.valueOf("a") will not work. Then again Blah.valueOf("a".toUpperCase()) would work.

João Portela
+3  A: 

Using Blah.valueOf(string) is best but you can use Enum.valueOf(Blah.class, string) as well.

Peter Lawrey
Um, didn't you notice you had already posted essentially the same answer... http://stackoverflow.com/questions/604424/java-enum-converting-string-to-enum/608156#608156
Jonik
Um, no let me fix that.
Peter Lawrey
+7  A: 

Here's a nifty utility I use:

/**
 * A common method for all enums since they can't have another base class
 * @param <T> Enum type
 * @param c enum type. All enums must be all caps.
 * @param string case insensitive
 * @return corresponding enum, or null
 */
public static <T extends Enum<T>> T getEnumFromString(Class<T> c, String string)
{
    if( c != null && string != null )
    {
        try
        {
            return Enum.valueOf(c, string.trim().toUpperCase());
        }
        catch(IllegalArgumentException ex)
        {
        }
    }
    return null;
}

Then in my enum class I usually have this to save some typing:

public static MyEnum fromString(String name)
{
    return getEnumFromString(MyEnum.class, name);
}

If your enums are not all caps, just change the Enum.valueOf line.

Too bad I can't use T.class for Enum.valueOf as T is erased.

Geoffrey Zheng
That empty catch block really drives me nuts, sorry.
Willi
+9  A: 

Another solution if the text is not the same to the enumeration value:

public enum Blah {
  A("text1"),
  B("text2"),
  C("text3"),
  D("text4");

  private String text;

  Blah(String text) {
    this.text = text;
  }

  public String getText() {
    return this.text;
  }

  public static Blah fromString(String text) {
    if (text != null) {
      for (Blah b : Blah.values()) {
        if (text.equalsIgnoreCase(b.text)) {
          return b;
      }
    }
    return null;
  }
}
JoséMi
`throw new IllegalArgumentException("No constant with text " + text + " found")` would be better than `return null`.
Willi