2010-10-08 4 views
37

Как получить имя типа Java Enum с учетом его значения?Java получает имя Enum с учетом значения Enum

Я написал код, который работает для определенного типа 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

Есть ли особая причина, по которой вы хотите использовать что-то другое, кроме имени() Enum, для поиска их? Это сбивает с толку много людей, и вы также не можете использовать простой 'Category.valueOf (name)'. – Thilo

ответ

30

Вы должны заменить вашу getEnumNameForValue вызовом метода name().

+1

@Jukia: Также рассмотрим переопределение 'toString()': http://download.oracle.com/javase/6/docs/api/java/lang/Enum.html#toString%28%29 – trashgod

+4

@trashgod: Она переопределяет toString – Thilo

+0

@Thilo: Моя ошибка; Благодарю. @Julia: Извините, что неправильно написано ваше имя. – trashgod

20

Try ниже код

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

Теперь вы можете использовать ниже код для получения Enum по значению

SalaryHeadMasterEnum.getEnumByString("Basic Pay") 

Используйте следующий код, чтобы получить ENUM в качестве строки

SalaryHeadMasterEnum.BASIC_PAY.name() 

Использование ниже код для получения строки Значение для перечисления

SalaryHeadMasterEnum.BASIC_PAY.toString() 
+2

'code == e.name' не будет работать так, как вы имели в виду, должен быть' e.name.equals (code) 'вместо –

+0

@f_puras вы проверили приведенный выше код? –

+4

Ну, да: 'SalaryHeadMasterEnum.getEnumByString (" basic pay ")' работает, но полагается на JVM-слияние строковых литералов. Такие вещи, как «SalaryHeadMasterEnum.getEnumByString» (новый StringBuilder («базовый») .append («платить»). ToString()) 'нет, но должен ИМХО. Использование 'String.equals()' сделает обе работы ;-) –

3

Try, следующий код ..

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

Это должно работать ну, но зачем вызывать функцию 'toString()' вместо 'getName()' (или что-то подобное)? – Tuzane

1

Вот код ниже, он возвращает имя Enum от значения 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; 
     } 
    } 
}