2010-10-08 5 views
37

Comment obtenir le nom d'un type Java Enum donné sa valeur?Java obtenant le nom Enum donné la valeur Enum

J'ai écrit un code qui fonctionne pour un type Enum particulier, puis-je le rendre plus générique?

Le type ENUM:

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

Y at-il une raison particulière pour laquelle vous voulez utiliser autre chose que le nom() du Enum pour les regardant? Cela perturberait beaucoup de gens, et vous ne pouvez pas non plus utiliser un simple 'Category.valueOf (name)'. – Thilo

Répondre

30

Vous devez remplacer votre getEnumNameForValue par un appel à la méthode name().

+1

@Jukia: En outre, envisager de remplacer 'toString()': http://download.oracle.com/javase/6/docs/api/java/lang/Enum.html#toString%28%29 – trashgod

+4

@trashgod: Elle est prioritaire toString – Thilo

+0

@Thilo: Mon erreur; Merci. @ Julia: Désolé d'avoir mal orthographié votre nom. – trashgod

20

Essayez ci-dessous le code

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

vous pouvez utiliser ci-dessous le code pour récupérer la Enum par la valeur

SalaryHeadMasterEnum.getEnumByString("Basic Pay") 

utilisation ci-dessous le code pour obtenir ENUM as String

SalaryHeadMasterEnum.BASIC_PAY.name() 

utilisation ci-dessous code pour obtenir la chaîne Valeur pour enum

SalaryHeadMasterEnum.BASIC_PAY.toString() 
+2

'code == e.name' ne fonctionnera pas comme vous le vouliez, devrait être' e.name.equals (code) 'à la place –

+0

@f_puras avez-vous testé le code ci-dessus ?? –

+4

Eh bien, oui: 'SalaryHeadMasterEnum.getEnumByString (" basic pay ")' fonctionne, mais repose sur les littéraux JVM fusionnant les chaînes. Des trucs comme 'SalaryHeadMasterEnum.getEnumByString (new StringBuilder (" basic ") .append (" pay "). ToString())' ne fonctionne pas, mais devrait à mon humble avis. Utiliser 'String.equals()' ferait fonctionner les deux ;-) –

3

Essayez, le code suivant ..

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

Ceci devrait fonctionner bien, mais pourquoi appeler la fonction 'toString()' au lieu de 'getName()' (Ou quelque chose de similaire)? – Tuzane

1

Voici le code ci-dessous, il retournera le nom Enum de la valeur Enum.

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