如何检查枚举值等于?
我如何检查枚举值的平等? 我尝试了以下,但它失败了。 为什么?
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???
由于您正在比较String
实例和Enum
实例,所以比较返回false
。
@RohitJain已经给出了一个很好的解释,为什么toString()
方法在你的比较中没有在他的答案中被调用,以及你应该如何使用它,如果它是你想要做的。
但是, toString()
不应该用于比较目的,它应该被重写仅提供对象的自定义字符串表示形式。
如果你这样做的话,你可以比较你在比较真实的比较属性:
String teststring = "1A".
Sysout(teststring.equals(Test.LETTER.getValue())); // Will return true
当然,你应该为value
属性提供一个getter,或者让它在进行比较的操作中可见。
你也可以在你的enum
编写一个isEqual()
方法,如下所示:
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
你的代码中有太多的其他编译器错误:
class enum Test
应该是enum Test
。 private
。 toString()
方法的返回类型是void
。 这不是一个有效的覆盖。 制作返回类型的String
。 我不知道这些错误是否仍然存在于您的原始代码中,或者仅仅是您的文章中的错误。
现在谈谈具体问题。 当你打印一个enum
常量时,会自动调用toString()
方法。 所以,当你打印Test.LETTER
时你会得到1A
。
将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);
只要按照以下方法进行检查,它就会起作用
teststring.equals(Test.LETTER.toString())
Test.LETTER
是一个枚举,因此它永远不会等于一个String,但它的值可以等于一个String,因此您必须直接使用enum的值进行检查。
上一篇: How to check equals on enum value?
下一篇: Singleton in java