2345 votes

Java - Convertir une chaîne en un enum

Disons que j'ai un enum qui est juste

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

et je voudrais trouver la valeur de l'enum d'une chaîne de caractères de par exemple "A" qui serait Blah.A . Comment serait-il possible de faire cela ?

Est-ce que le Enum.ValueOf() la méthode dont j'ai besoin ? Si oui, comment puis-je l'utiliser ?

2602voto

Michael Myers Points 82361

Oui, Blah.valueOf("A") vous donnera Blah.A .

Les méthodes statiques valueOf() et values() sont créés au moment de la compilation et n'apparaissent pas dans le code source. En revanche, ils apparaissent dans la Javadoc, par exemple, Dialog.ModalityType montre les deux méthodes.

1040voto

JoséMi Points 2845

Une autre solution si le texte n'est pas le même que la valeur de l'énumération :

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

133voto

Geoffrey Zheng Points 3503

Voici un utilitaire astucieux que j'utilise :

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

Ensuite, dans ma classe d'enum, j'ai généralement ceci pour économiser de la saisie :

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

Si vos enums ne sont pas en majuscules, il suffit de modifier la ligne Enum.valueOf.

Dommage que je ne puisse pas utiliser T.class pour Enum.valueOf car T est effacé.

81voto

João Portela Points 2067

Vous devez également faire attention à votre dossier. Je m'explique : faire Blah.valueOf("A") fonctionne, mais Blah.valueOf("a") ne fonctionnera pas. Encore une fois Blah.valueOf("a".toUpperCase(Locale.ENGLISH)) fonctionnerait.

modifier
Modifié toUpperCase à toUpperCase(Locale.ENGLISH) sur la base de tc. commentaire et le docs java

edit2 Sur Android, vous devez utiliser Locale.US comme sulai fait remarquer .

41voto

Patrick Arnesen Points 315

Voici une méthode qui peut le faire pour n'importe quel Enum, et qui est insensible à la casse.

/** 
 * Finds the value of the given enumeration by name, case-insensitive. 
 * Throws an IllegalArgumentException if no match is found.  
 **/
public static <T extends Enum<T>> T valueOfIgnoreCase(Class<T> enumeration, String name) {
    for(T enumValue : enumeration.getEnumConstants()) {
        if (enumValue.name().equalsIgnoreCase(name)) {
            return enumValue;
        }
    }
    throw new IllegalArgumentException("There is no value with name '" + name + " in Enum " + enumeration.getClass().getName());        
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X