如何在枚举值上检查等于?

时间:2013-10-25 09:36:54

标签: java enums

如何检查枚举值的相等性?我尝试了以下,但它失败了。为什么呢?

class enum Test {
    LETTER("1A");

    private String value;
    public Test(String value) {
        this.value = value;
    }

    @Override
    public void toString() {
        return value;
    }
}


String teststring = "1A".
Sysout(teststring.equals(Test.LETTER)); //false. Why???

5 个答案:

答案 0 :(得分:8)

您的代码中存在很多其他编译器错误:

  • class enum Test应为enum Test
  • 枚举的构造函数只能是private
  • toString()方法的返回类型为void。这不是有效的覆盖。返回类型String

我不知道这些错误是否仍然存在于您的原始代码中,或者只是您的帖子中的错误。

现在回答具体问题。当您打印enum常量时,会自动调用toString()方法。因此,当您打印1A时,您会获得Test.LETTER

Test.LETTER作为参数传递给任何方法时都不是这样。您必须明确调用toString()。那应该是:

System.out.println(teststring.equals(Test.LETTER.toString()));

另一种方法是在枚举本身中提供一个方法,它为特定的字符串值提供enum常量:

public static Test of(String str) {
    for (Test test: values()) {
        if (test.value.equals(str)) {
            return test;
        }
    }
    return null;
}

您甚至可以缓存values()方法返回的数组,以便不会一次又一次地创建它。

然后只需将枚举常量比较为:

String teststring = "1A";
System.out.println(Test.of(teststring) == Test.LETTER);

答案 1 :(得分:6)

比较正在返回false,因为您正在将String实例与Enum实例进行比较。

@RohitJain已经很好地解释了为什么toString()方法在his answer的比较中没有被调用,以及如果它是你应该如何使用它想做。

但是,toString()不应用于比较目的,应该仅覆盖它以提供对象的自定义字符串表示。

如果您这样做,您可以比较您在比较中真正相互影响的属性:

String teststring = "1A".
Sysout(teststring.equals(Test.LETTER.getValue())); // Will return true

当然,您应该为value属性提供一个getter,或让它对进行比较的操作可见。

您还可以在isEqual()中对enum方法进行编码,如下所示:

enum Test {
    LETTER("1A");

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

    @Override
    public String toString() {
        return value;
    }

    public boolean isEqual(String value) { 
        return this.value.equals(value);
    }
}

只需Test.LETTER.isEqual(teststring)进行此比较。

甚至是static getByValue(String value)方法来获取给定value的枚举实例:

enum Test { 
    ...
    public static Test getByValue(String val) { 
        for (Test c : values()) {
            if (c.value.equals(val)) {
                return c;
            }
        }
    } 
} 

Test x = Test.getByValue("1A"); // x == Test.LETTER

答案 2 :(得分:1)

只需按以下方式进行检查,它就能正常工作

teststring.equals(Test.LETTER.toString())

Test.LETTER是一个枚举,所以它永远不会等于一个String,但它的值可以等于一个String,所以你必须直接使用枚举的值来检查。

答案 3 :(得分:0)

因为String's equals方法正在检查收到的对象是否为String。如果您尝试Test.LETTER.toString(),它应该有用。

答案 4 :(得分:0)

由于String对象和ENUM实例之间的比较,这将返回false标志。

如果你这样做:

String variable1 = "1A".
boolean flag = variable1.equals(Test.LETTER.value); 
system.out.println(flag);

这将返回

True

尽管

IN java .equals 方法看起来像这样

public final boolean equals(Object other) { 
    return this==other;
}

我总是使用==因为它是空的安全。