2010-10-08 61 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; 
     } 
    } 
}