2016-03-30 59 views
1

我想我還沒有在Java中得到Enum的概念。如何比較字符串與Java中的switch語句中的枚舉?

我嘗試比較字符串與我的枚舉條目可比較Special characters in an enum

package com.stackoverflow.tests; 

public class EnumTest { 

    enum EnumTestOperator { 
    EQUAL("=="), 
    NOT_EQUAL("!="); 

    private String value; 

    private EnumTestOperator(String value) { 
     this.value = value; 
    } 

    public String toString() { 
     // will return == or != instead of EQUAL or NOT_EQUAL 
     return this.value; 
    } 

    } 

    public static void main(String[] args) { 
    String line; 
    line = "<>"; 
    line = ".ne."; 
    line = "!="; 

    // Operator 
    switch(line) { 
//  case "!=": 
     case EnumTestOperator.NOT_EQUAL: 
     System.out.println("Not Equal"); 
     break; 
     default: 
     System.out.println("Something else"); 
     break; 
    } 
    } 

} 

但在線路:

case EnumTestOperator.NOT_EQUAL: 

我得到一個編譯錯誤:

Type mismatch: cannot convert from EnumTest.EnumTestOperator to String 

我在做什麼錯?

+0

你混淆了不同類型的對象;因爲Java是強類型的,這會導致錯誤 –

回答

4

您正在比較不兼容的類型。它類似於聲明

"some string" == EnumTestOperator.NOT_EQUAL 

其中您將字符串值與枚舉常量進行比較。

只要停止使用枚舉和它們聲明爲字符串常量:

private static final String EQUAL = "=="; 
private static final String NOT_EQUAL = "!="; 

然後你就可以在交換機/箱使用它們。


另一種解決方案是根據您的輸入找到枚舉常量。添加到您的枚舉:

public static EnumTestOperator byValue(String val){ 
    for(EnumTestOperator en:values()){ 
    if(en.value.equals(val)){ 
     return en; 
    } 
    } 
    return null; 
} 

然後使用這樣的功能:

EnumTestOperator en = EnumTestOperator.byValue(line); 
switch(en) { 
    case NOT_EQUAL: 
    System.out.println("Not Equal"); 
    break; 
    default: 
    System.out.println("Something else"); 
    break; 
} 

不幸的是,你將不得不處理不同的null情況下,因爲把一個nullswitch將拋出一個NullPointerException

+0

我認爲你也可以使用預定義的方法'valueOf()'。見[這裏](https://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html#valueOf(java.lang.Class,%20java.lang.String)) – zypro

+0

@zypro你不能。 ''valueOf''需要常量的名字(比如'''NOT_EQUAL「''',這裏沒有給出。 – f1sh

1

EnumTestOperator.NOT_EQUALEnumTestOperator的一個實例。您無法將其與String進行比較。 (case語句需要Java中的常量表達式)。

但是你可以在EnumTestOperator常量,而不是重複:

public static EnumTestOperator find(String strValue) { 
    for(EnumTestOperator operator : EnumTestOperator.values()) { 
    if(operator.toString().equals(strValue)) { 
     return operator; 
    } 
    } 
    throw new IllegalArgumentException("No matching value"); 
}