2010-10-08 3 views
37

Come si ottiene il nome di un tipo di Java Enum in base al relativo valore?Java ha ottenuto il nome Enum in base al valore Enum

Ho scritto codice che funziona per un particolare tipo Enum, posso renderlo più generico?

Il tipo 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

C'è un motivo particolare per cui si desidera utilizzare qualcosa di diverso dal nome() dell'Enum per cercarli? Questo potrebbe confondere un sacco di gente, e non puoi nemmeno usare un semplice 'Category.valueOf (name)'. – Thilo

risposta

30

necessità di sostituire le getEnumNameForValue da una chiamata al metodo name().

+1

@Jukia: considera anche l'override di 'toString()': http://download.oracle.com/javase/6/docs/api/java/lang/Enum.html#toString%28%29 – trashgod

+4

@trashgod: She sta ignorando toString – Thilo

+0

@Thilo: Il mio errore; Grazie. @ Julia: Mi dispiace per aver sbagliato a scrivere il tuo nome. – trashgod

20

Prova sottostante Codice

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

Ora è possibile utilizzare sotto il codice per recuperare l'Enum da Valore

SalaryHeadMasterEnum.getEnumByString("Basic Pay") 

Usa Sotto codice per ottenere ENUM as String

SalaryHeadMasterEnum.BASIC_PAY.name() 

Usa sotto codice per ottenere string Valore per enum

SalaryHeadMasterEnum.BASIC_PAY.toString() 
+2

'codice == e.name' non funzionerà come volevi, dovrebbe essere' e.name.equals (code) 'invece –

+0

@f_puras hai testato il codice sopra ?? –

+4

Bene, sì: 'SalaryHeadMasterEnum.getEnumByString (" basic pay ")' funziona, ma si basa sulla fusione JVM di stringhe letterali. Stuff come 'SalaryHeadMasterEnum.getEnumByString (new StringBuilder (" basic ") .append (" pay "). ToString())' non lo fa, ma dovrebbe IMHO. Usare 'String.equals()' renderebbe entrambi funzionanti ;-) –

3

prova, il codice seguente ..

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

Questo dovrebbe funzionare beh, ma perché chiamare la funzione 'toString()' invece di 'getName()' (o qualcosa di simile)? – Tuzane

1

Ecco il codice qui sotto, verrà restituito il nome Enum dal valore 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; 
     } 
    } 
}