如何检查枚举值的相等性?我尝试了以下,但它失败了。为什么呢?
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???
答案 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;
}
我总是使用==因为它是空的安全。