Domanda Cerca enum Java per valore stringa


Dì che ho un enum che è giusto

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

e mi piacerebbe trovare il valore enum di una stringa, per esempio "A" quale sarebbe Blah.A. Come sarebbe possibile farlo?

È il Enum.valueOf() il metodo che mi serve? Se sì, come dovrei usare questo?


1590
2018-03-02 22:56


origine


risposte:


Sì, Blah.valueOf("A") ti darò Blah.A.

Si noti che il nome deve essere un esatto partita, incluso il caso: Blah.valueOf("a") e Blah.valueOf("A ") entrambi lanciano un IllegalArgumentException.

I metodi statici valueOf() e values() sono creati in fase di compilazione e non compaiono nel codice sorgente. Appaiono in Javadoc, però; per esempio, Dialog.ModalityType mostra entrambi i metodi.


1851
2018-03-02 22:57



Un'altra soluzione se il testo non è uguale al valore di enumerazione:

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) {
    for (Blah b : Blah.values()) {
      if (b.text.equalsIgnoreCase(text)) {
        return b;
      }
    }
    return null;
  }
}

709
2018-06-03 10:57



Ecco un'utile utility che utilizzo:

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

Poi nella mia classe enum di solito ho questo per risparmiare un po 'di digitazione:

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

Se le tue enumerazioni non sono tutte maiuscole, cambia semplicemente Enum.valueOf linea.

Peccato che non posso usare T.class per Enum.valueOf come T è cancellato.


98
2017-11-12 15:52



Dovresti anche stare attento al tuo caso. Lasciami spiegare: facendo Blah.valueOf("A") funziona, ma Blah.valueOf("a") non funzionerà. Poi ancora Blah.valueOf("a".toUpperCase(Locale.ENGLISH)) funzionerebbe.

modificare
Cambiato toUpperCase a toUpperCase(Locale.ENGLISH) basato su tc. commento e il documenti java

EDIT2 Su Android dovresti usare Locale.US, come sottolinea sulai.


66
2018-05-09 16:33



Usa il modello di Joshua Bloch, Efficace Java:

(semplificato per brevità)

enum MyEnum {
  ENUM_1("A"),
  ENUM_2("B");

  private String name;

  private static final Map<String,MyEnum> ENUM_MAP;

  MyEnum (String name) {
    this.name = name;
  }

  public String getName() {
    return this.name;
  }

  // Build an immutable map of String name to enum pairs.
  // Any Map impl can be used.

  static {
    Map<String,MyEnum> map = new ConcurrentHashMap<String,MyEnum>();
    for (MyEnum instance : MyEnum.values()) {
      map.put(instance.getName(),instance);
    }
    ENUM_MAP = Collections.unmodifiableMap(map);
  }

  public static MyEnum get (String name) {
    return ENUM_MAP.get(name);
  }
}

Vedi anche:

Oracle Java Example usando Enum e Map delle istanze

Ordine di esecuzione di blocchi statici in un tipo Enum

Come posso cercare un enum Java dal suo valore di stringa


37
2018-06-15 16:37



Ecco un metodo che può farlo per qualsiasi Enum ed è insensibile al maiuscolo / minuscolo.

/** 
 * 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(String.format(
        "There is no value with name '%s' in Enum %s",
        name, enumeration.getName()
    ));
}

35
2017-12-01 21:53



utilizzando Blah.valueOf(string) è meglio ma puoi usare Enum.valueOf(Blah.class, string) anche.


28
2018-05-09 17:23



Se non vuoi scrivere la tua utility usa Google  biblioteca:

Enums.getIfPresent(Blah.class, "A")

A differenza della funzione java integrata, è possibile controllare se A è presente in Blah e non lancia un'eccezione.


22
2018-04-02 20:12