2016-03-30 24 views
1

Henüz Java'da Enum s kavramını anlamadım.Java'da bir anahtar deyiminde enum ile dizgi karşılaştırması nasıl yapılır?

Dizeleri Special characters in an enum ile karşılaştırılabilir Enum girişlerimle karşılaştırmaya çalışıyorum.

Type mismatch: cannot convert from EnumTest.EnumTestOperator to String 

yanlış yapıyorum:

case EnumTestOperator.NOT_EQUAL: 

bir derleyici hatası alıyorum:
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; 
    } 
    } 

} 

Ama Hattı

?

+0

; Java güçlü bir şekilde yazılırsa bu hatalara yol açar. –

cevap

4

Uyumsuz türleri karşılaştırıyorsunuz.

ifadesine benzer, burada bir dizgi değerini bir enum sabitiyle karşılaştırınız.

Sadece çeteleler kullanmayı bırakın ve dize sabitleri olarak ilan:

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

Sonra anahtarı/durumunda kullanabilirsiniz.


Diğer çözüm, girdinize bağlı olarak enum sabitini bulmak olacaktır.

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

Ve sonra böyle işlevini kullanın: enum Bu ekle

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

Maalesef bir NullPointerException atacağım bir switch içine null koyarak beri farklı null olaya el gerekecektir.

+0

Ben de önceden tanımlanmış olan 'valueOf()' metodunu kullanabilirsiniz. Bkz. [Burada] (https://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html#valueOf (java.lang.Class,% 20java.lang.String)) – zypro

+0

@zypro hayır yapamazsın. '' valueOf'', sabiti ismini (burada "verilmeyen" '' NOT_EQUAL "' gibi) bekler. – f1sh

1

EnumTestOperator.NOT_EQUAL, EnumTestOperator'un bir örneğidir. Bunu String ile karşılaştıramazsınız.

Sen evenutually bir String ile EnumTestOperator.NOT_EQUAL.toString() karşılaştırabilirsiniz ancak case açıklamada (case ifadeleri Java sabit ifadeleri gerektirir) değil.

Ama bunun yerine EnumTestOperator sabitler üzerinde yineleme yapabilirsiniz: nesnelere farklı türdeki karıştırma ediyoruz

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