Cómo obtener un valor de enumeración de un valor de cadena en Java

5 minutos de lectura

Como obtener un valor de enumeracion de un valor de
Malaquías

Digamos que tengo una enumeración que es solo

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

y me gustaría encontrar el valor de enumeración de una cadena, por ejemplo "A" cuál podría ser Blah.A. ¿Cómo sería posible hacer esto?

Es el Enum.valueOf() el método que necesito? Si es así, ¿cómo usaría esto?

1646969648 337 Como obtener un valor de enumeracion de un valor de
jose mi

Otra solución si el texto no es el mismo que el valor de la enumeración:

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

  • throw new IllegalArgumentException("No constant with text " + text + " found") sería mejor que return null.

    – whiskysierra

    31 de julio de 2010 a las 10:28

  • @Sangdol, por lo general, es bueno verificar qué está haciendo SUN – ups – Oracle en la misma situación. Y como Enum.valueOf() lo está mostrando ES la mejor práctica para lanzar una excepción en este caso. Porque es una situación excepcional. La “optimización del rendimiento” es una mala excusa para escribir código ilegible 😉

    – raudi

    2 de febrero de 2012 a las 7:43


  • Esto es aún más simple en Java 8 como puede hacer:Stream.of(MyEnum.values()).collect(toMap(Enum::name, identity())) También recomiendo anular toString() (pasado a través del constructor) y usarlo en lugar del nombre, especialmente si el Enum está asociado con datos serializables, ya que esto le permite controlar la carcasa sin darle un ajuste a Sonar.

    – Novaterata

    27 de abril de 2017 a las 17:01


  • La inicialización estática está inherentemente sincronizadapor lo que no hay absolutamente ninguna razón para usar ConcurrentHashMap aquí, donde el mapa nunca se modifica después de la inicialización. Por lo tanto, por qué incluso, por ejemplo, el ejemplo en el JLS en sí usa un regular HashMap.

    – Radiodef

    5 de agosto de 2018 a las 17:24


Como obtener un valor de enumeracion de un valor de
Geoffrey Zheng

Aquí hay una utilidad ingeniosa que uso:

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

Luego, en mi clase de enumeración, generalmente tengo esto para ahorrar algo de escritura:

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

Si sus enumeraciones no son todas mayúsculas, simplemente cambie el Enum.valueOf línea.

Es una pena que no pueda usar T.class por Enum.valueOf como T se borra

  • Ese bloque de captura vacío realmente me vuelve loco, lo siento.

    – whiskysierra

    31 de julio de 2010 a las 10:14

  • @LazloBonin: Las excepciones son para condiciones excepcionales, no para control de flujo. Consíguete una copia de Java efectivo.

    – Martín Schröder

    15 de noviembre de 2011 a las 17:09

  • ¡Horrible! Siempre, siempre captura excepciones donde puedas manejarlas. El ejemplo anterior es un ejemplo perfecto. como NO hacerlo. ¿Por qué? Entonces devuelve NULL, y la persona que llama tiene que verificar NULL o lanzar un NPE. Si la persona que llama sabe cómo manejar la situación, entonces hacer un si contra un intento de captura puede parecer un poco más elegante, PERO si no puede manejar, tiene que pasar nulo nuevamente y la persona que llama de la persona que llama otra vez tiene que verificar contra NULL, etc. etc.

    – raudi

    2 de febrero de 2012 a las 7:52

  • @whiskeysierra Entiendo que ser un apasionado de Java o el desarrollo de software es una cosa, pero tienes que relajarte. No hay beneficio en geeking / ser extra como este.

    – Akash Verma

    21 de septiembre de 2021 a las 13:42


1646969649 313 Como obtener un valor de enumeracion de un valor de
Pedro Mortensen

También debe tener cuidado con su caso. Me explico: haciendo Blah.valueOf("A") funciona, pero Blah.valueOf("a") no trabajará. Entonces otra vez Blah.valueOf("a".toUpperCase(Locale.ENGLISH)) trabajaría.

En Android deberías usar Locale.UScomo señala sulai.

  • Ese bloque de captura vacío realmente me vuelve loco, lo siento.

    – whiskysierra

    31 de julio de 2010 a las 10:14

  • @LazloBonin: Las excepciones son para condiciones excepcionales, no para control de flujo. Consíguete una copia de Java efectivo.

    – Martín Schröder

    15 de noviembre de 2011 a las 17:09

  • ¡Horrible! Siempre, siempre captura excepciones donde puedas manejarlas. El ejemplo anterior es un ejemplo perfecto. como NO hacerlo. ¿Por qué? Entonces devuelve NULL, y la persona que llama tiene que verificar NULL o lanzar un NPE. Si la persona que llama sabe cómo manejar la situación, entonces hacer un si contra un intento de captura puede parecer un poco más elegante, PERO si no puede manejar, tiene que pasar nulo nuevamente y la persona que llama de la persona que llama otra vez tiene que verificar contra NULL, etc. etc.

    – raudi

    2 de febrero de 2012 a las 7:52

  • @whiskeysierra Entiendo que ser un apasionado de Java o el desarrollo de software es una cosa, pero tienes que relajarte. No hay beneficio en geeking / ser extra como este.

    – Akash Verma

    21 de septiembre de 2021 a las 13:42


En Java 8 o posterior, usando Corrientes:

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 Optional<Blah> fromText(String text) {
        return Arrays.stream(values())
          .filter(bl -> bl.text.equalsIgnoreCase(text))
          .findFirst();
    }
}

  • Java 8 hizo algunas cosas buenas y, aunque me gustan los Streams (principalmente para la concurrencia)… en realidad, esta NO es una razón para usarlos. No compra nada al OP y funciona peor… simplemente sustituyendo un bucle for/next a través de todos los elementos por una versión Stream del mismo (y ni siquiera en paralelo). Para algunas entradas …. a quién le importa, pero para ser claros, este no es un ejemplo de “es mucho mejor debido a Java 8”. Es solo una implementación ‘diferente’ verde vs azul de estilo fluido del mismo que devuelve un Opcional frente a nulo (y el estilo fluido requiere un retorno no nulo para todos los métodos unidos).

    –Darrell Teague

    9 sep 2021 a las 22:48

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad