Java 如何检查枚举值是否等于?
如何检查枚举值的相等性?我尝试了以下方法,但失败了。为什么?Java 如何检查枚举值是否等于?,java,enums,Java,Enums,如何检查枚举值的相等性?我尝试了以下方法,但失败了。为什么? class enum Test { LETTER("1A"); private String value; public Test(String value) { this.value = value; } @Override public void toString() { return value; } } String teststr
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???
比较返回的是
false
,因为您正在将String
实例与Enum
实例进行比较
@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)
即可进行此比较
甚至可以使用静态getByValue(String 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
只要按照下面的方法进行检查,它就会工作
teststring.equals(Test.LETTER.toString())
Test.LETTER
是一个枚举,因此它永远不会等于字符串,但它的值可以等于字符串,因此您必须直接使用枚举的值进行检查。因为String的equals
方法也在检查接收的对象是否为String
。如果您尝试使用Test.LETTER.toString()
它应该可以工作,因为您的代码中还有很多其他编译器错误:
类枚举测试
应为枚举测试
- 枚举的构造函数只能是
private
toString()
方法的返回类型为void
。这不是有效的覆盖。将返回类型设置为字符串
我不知道这些错误是否也存在于您的原始代码中,或者只是您的帖子中的一个错误
现在来谈具体问题。打印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);
由于字符串对象和枚举实例之间的比较,这将返回false标志
如果您这样做:
String variable1 = "1A".
boolean flag = variable1.equals(Test.LETTER.value);
system.out.println(flag);
这会回来的
True
尽管如此
在java中,.equals方法如下所示
public final boolean equals(Object other) {
return this==other;
}
我总是使用==因为它是空安全的。“在java中,equals和==在逻辑上是相同的”这是完全错误的不同类有不同的equals的实现。因为问题是关于String.equals
的,所以您的陈述仍然是错误的。在比较字符串时使用==
而不是equals
是一个错误。谢谢,当然这些错误在我的代码中不存在,只是一个(太)快速的输入错误。@RohitJain+1但实际上您提供的函数可能会出现潜在问题。如果您有字母_B(“1A”),字母(“1A”)
作为枚举常量,Test.of(teststring)==Test.LETTER)
将返回false
。(即使这个EnUM COSTANS实际上是愚蠢的,因为它们基本上是相同的)“ZouououHealth:这是真的,但是我不认为这些案例是比较的,正如你已经说过的,这些枚举将是愚蠢的。使用==
比较枚举常量是完全可以接受的做法。请参阅@Rohit Jain“使用==来比较枚举常量是完全可以接受的做法。”-没错,但您是在使用==
来比较String
s。但这是另一个问题,返回单个对象的方法无法处理两个对象匹配条件的情况。@Holger Oops。那是我这边的一个错误。谢谢你指出这一点。