2016-03-30 3 views
1

私はまだJavaでEnumの概念を得ていないと思います。Javaのswitch文でstringとenumを比較するにはどうすればよいですか?

文字列をSpecial characters in an enumに匹敵する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; 
    } 
    } 

} 

しかし、LINE IN:

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

は、残念ながら、あなたがNullPointerExceptionをスローしますswitchnullを入れているため、異なるnullケースを処理する必要があります。

+0

私はあなたが定義済みのメソッド 'valueOf()'を使うこともできると思います。 [here](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_EQUALは、EnumTestOperatorのインスタンスです。 Stringと比較することはできません。

EnumTestOperator.NOT_EQUAL.toString()Stringを偶数比較できますが、case文(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"); 
}