2010-10-08 31 views
37

¿Cómo obtengo el nombre de un tipo Java Enum dado su valor?Java obteniendo el nombre Enum dado el valor Enum

He escrito un código que funciona para un tipo particular de Enum, ¿puedo hacerlo más genérico?

El tipo de enumeración:

public enum Category { 

    APPLE("3"), 
    ORANGE("1"), 
    GRAPE("GRAPE"), 
    BANANA("Banana"); 

    private final String identifier; 

    /** 
    * Constructor. 
    * 
    * @param identifier 
    *   - identfier. 
    */ 
    private Category(String identifier) { 
     this.identifier = identifier; 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    public String toString() { 
     return identifier; 
    } 

    public static String getEnumNameForValue(Object value){ 
     Category[] values = Category.values(); 
     String enumValue = null; 
     for(Category eachValue : values) { 
      enumValue =eachValue.toString(); 

      if (enumValue.equals(value)) { 
       return eachValue.name(); 
      } 
     } 
    return enumValue; 
    } 
} 
+1

¿Hay algún motivo especial por el que desee utilizar algo que no sea el nombre() del Enum para buscarlos? Eso confundiría a mucha gente, y tampoco puede usar un simple 'Category.valueOf (nombre)'. – Thilo

Respuesta

30

se deben sustituir los getEnumNameForValue por una llamada al método name().

+1

@Jukia: Además, considere reemplazar 'toString()': http://download.oracle.com/javase/6/docs/api/java/lang/Enum.html#toString%28%29 – trashgod

+4

@trashgod: She está anulando aString – Thilo

+0

@Thilo: Mi error; Gracias. @Julia: Perdón por haber escrito mal tu nombre. – trashgod

20

Try continuación Código

public enum SalaryHeadMasterEnum { 

    BASIC_PAY("basic pay"), 
    MEDICAL_ALLOWANCE("Medical Allowance"); 

    private String name; 

    private SalaryHeadMasterEnum(String stringVal) { 
     name=stringVal; 
    } 
    public String toString(){ 
     return name; 
    } 

    public static String getEnumByString(String code){ 
     for(SalaryHeadMasterEnum e : SalaryHeadMasterEnum.values()){ 
      if(code == e.name) return e.name(); 
     } 
     return null; 
    } 
} 

Ahora se puede usar debajo de código para recuperar la enumeración por valor

SalaryHeadMasterEnum.getEnumByString("Basic Pay") 

Uso continuación código para obtener ENUM como cadena

SalaryHeadMasterEnum.BASIC_PAY.name() 

Uso de abajo código para obtener cadena Valor para enum

SalaryHeadMasterEnum.BASIC_PAY.toString() 
+2

'code == e.name' no va a funcionar de la forma en que usted lo quiso decir, debe ser' e.name.equals (code) 'en su lugar –

+0

@f_puras ¿ha probado el código anterior? –

+4

Bueno, sí: 'SalaryHeadMasterEnum.getEnumByString (" pago básico ")' funciona, pero se basa en la fusión de JVM literales de cadena. Cosas como 'SalaryHeadMasterEnum.getEnumByString (new StringBuilder (" basic ") .append (" pay "). ToString())' no, pero en mi humilde opinión. Usar 'String.equals()' haría que ambos funcionaran ;-) –

3

intento, el siguiente código ..

@Override 
    public String toString() { 
    return this.name(); 
    } 
+0

Esto debería funcionar bien, pero ¿por qué llamar a la función 'toString()' en lugar de 'getName()' (O algo similar)? – Tuzane

1

Aquí está el código de abajo, devolverá el nombre de enumeración del valor de enumeración.

public enum Test { 

    PLUS("Plus One"), MINUS("MinusTwo"), TIMES("MultiplyByFour"), DIVIDE(
      "DivideByZero"); 
    private String operationName; 

    private Test(final String operationName) { 
     setOperationName(operationName); 
    } 

    public String getOperationName() { 
     return operationName; 
    } 

    public void setOperationName(final String operationName) { 
     this.operationName = operationName; 
    } 

    public static Test getOperationName(final String operationName) { 

     for (Test oprname : Test.values()) { 
      if (operationName.equals(oprname.toString())) { 
       return oprname; 
      } 
     } 
     return null; 
    } 

    @Override 
    public String toString() { 
     return operationName; 
    } 
} 

public class Main { 
    public static void main(String[] args) { 

     Test test = Test.getOperationName("Plus One"); 
     switch (test) { 
     case PLUS: 
      System.out.println("Plus....."); 
      break; 
     case MINUS: 
      System.out.println("Minus....."); 
      break; 

     default: 
      System.out.println("Nothing.."); 
      break; 
     } 
    } 
}