2010-10-08 53 views
37

如何根据给定值的Java枚举类型获取名称?获取给定Enum值的枚举名称的Java

我已经编写了适用于特定枚举类型的代码,我可以使它更通用吗?

枚举类型:

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 2010-10-08 09:36:12

回答

30

你应该更换你的getEnumNameForValue通过对name()方法的调用。

+1

@Jukia:另外,考虑重写'toString()':http://download.oracle.com/javase/6/docs/api/java/lang/Enum.html#toString%28%29 – trashgod 2010-10-08 11:58:17

+4

@trashgod:她重写toString – Thilo 2010-10-09 01:43:33

+0

@Thilo:我的错误;谢谢。 @Julia:对不起你的名字拼写错误。 – trashgod 2010-10-09 01:54:43

20

试试下面的代码

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

现在你可以使用下面的代码按值检索枚举

SalaryHeadMasterEnum.getEnumByString("Basic Pay") 

使用下面的代码来获得ENUM的字符串下面

SalaryHeadMasterEnum.BASIC_PAY.name() 

使用获取字符串的代码枚举的值

SalaryHeadMasterEnum.BASIC_PAY.toString() 
+2

'code == e.name'不会按照你的意思工作,应该是'e.name.equals(code)'而不是 – 2016-11-22 14:40:49

+0

@f_puras你测试了上面的代码吗? – 2016-11-22 15:40:00

+4

嗯,是的:'SalaryHeadMasterEnum.getEnumByString(“基本工资”)确实有效,但依赖于JVM合并字符串文字。像SalaryHeadMasterEnum.getEnumByString(新的StringBuilder(“基本”).append(“pay”)。toString())'的东西没有,但应该恕我直言。使用'String.equals()'将使两者都工作;-) – 2016-11-22 21:46:06

3

尝试,下面的代码..

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

这应该工作好吧,但为什么调用函数'toString()'而不是'getName()'(或类似的东西)? – Tuzane 2016-10-20 11:15:49

1

这里是下面的代码,它将从枚举值返回枚举的名称。

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