2016-03-30 35 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"); 
}