Vraag Zoek Java-opkomst op stringwaarde


Stel dat ik een opsomming heb die rechtvaardig is

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

en ik zou graag de enum-waarde van een string willen vinden, bijvoorbeeld "A" welke zou zijn Blah.A. Hoe zou het mogelijk zijn om dit te doen?

Is de Enum.valueOf() de methode die ik nodig heb? Zo ja, hoe zou ik dit gebruiken?


1590
2018-03-02 22:56


oorsprong


antwoorden:


Ja, Blah.valueOf("A") zal je geven Blah.A.

Merk op dat de naam een ​​naam moet zijn exact match, inclusief case: Blah.valueOf("a") en Blah.valueOf("A ") beide gooien een IllegalArgumentException.

De statische methoden valueOf() en values() worden gemaakt tijdens het compileren en verschijnen niet in de broncode. Ze verschijnen echter in Javadoc; bijvoorbeeld, Dialog.ModalityType toont beide methoden.


1851
2018-03-02 22:57



Een andere oplossing als de tekst niet hetzelfde is als de opsommingswaarde:

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



Hier is een handige tool die ik gebruik:

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

Dan in mijn enum-klasse heb ik dit meestal om wat typen te besparen:

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

Als uw enums niet allemaal caps zijn, hoeft u alleen de Enum.valueOf lijn.

Jammer dat ik het niet kan gebruiken T.class voor Enum.valueOf als T is gewist.


98
2017-11-12 15:52



Je moet ook voorzichtig zijn met je zaak. Laat me het uitleggen: doen Blah.valueOf("A") werkt, maar Blah.valueOf("a") zal niet werken. Nogmaals Blah.valueOf("a".toUpperCase(Locale.ENGLISH)) zou werken.

Bewerk
Changed toUpperCase naar toUpperCase(Locale.ENGLISH) gebaseerd op tc. commentaar en de java docs

edit2 Op Android moet je gebruiken Locale.US, als Sulai wijst erop.


66
2018-05-09 16:33



Gebruik het patroon van Joshua Bloch, Effectieve Java:

(vereenvoudigd voor beknoptheid)

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

Zie ook:

Oracle Java-voorbeeld met behulp van Enum en Kaart met instanties

Uitvoeringsvolgorde van statische blokken in een Enum-type

Hoe kan ik een Java-opsomming opzoeken uit de tekenreekswaarde


37
2018-06-15 16:37



Hier is een methode die het voor elk Enum kan doen, en is hoofdletterongevoelig.

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



Gebruik makend van Blah.valueOf(string) is het beste maar je kunt gebruiken Enum.valueOf(Blah.class, string) ook.


28
2018-05-09 17:23



Als u niet uw eigen hulpprogramma wilt schrijven, gebruikt u Google's  bibliotheek:

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

In tegenstelling tot de ingebouwde java-functie laat het je controleren of A aanwezig is in Blah en werpt geen uitzondering.


22
2018-04-02 20:12