我使用Java项目和Eclipse(版本3.6.2)作为IDE,在枚举比较中我得到一个奇怪的行为,遵循一个奇怪的例子:
全局变量:
StatusType status = StatusType.SIGNATURE;
代码:
String trsStatus = "END";
if(trsStatus.equals("END") && (this.status.compareTo(StatusType.SIGNATURE) != 0)){
//Do something
}
这个比较成功并输入if块,为什么?在这种情况下,if语句的第二次评估(this.status.compareTo(StatusType.SIGNATURE)!= 0)失败,因为结果为false!为什么java会进入块???
如果我在eclipse调试器的表达式观察器上计算表达式,则语句的值为:
trsStatus.equals(“END”)--->真
(this.status.compareTo(StatusType.SIGNATURE)!= 0)--->假
如果我将if语句中第二个表达式的结果赋给布尔变量,我已经完成了另一个测试:
boolean sign = (this.status.compareTo(StatusType.SIGNATURE) != 0);
我得到了这个结果:
(this.status.compareTo(StatusType.SIGNATURE)!= 0)--->假
签署--->真
为什么?!?
这怎么可能?
答案 0 :(得分:2)
可能 StatusType
以某种奇怪的方式覆盖compareTo()
吗?
是否还有其他线程可以更改status
字段的值?
在任何情况下,您都应该使用equals()
甚至==
而不是compareTo()
。
答案 1 :(得分:2)
this.status.compareTo(StatusType.SIGNATURE) != 0
将返回零,因为零意味着它们是相等的。 compareTo()
返回1,-1或0,基于哪个值被认为更大。
答案 2 :(得分:1)
我能想象的唯一明智的原因是
this.status != StatusType.SIGNATURE
周期。您可能在不知不觉中将状态设置为其他值。也许与另一个线程。谁知道。在调试器中状态评估的是什么?
无论如何,Java中肯定没有这样的“bug”。除非你发布一些证明它的代码; - )
答案 3 :(得分:0)
您应该使用:this.status != StatusType.SIGNATURE
。
答案 4 :(得分:0)
public class Test {
public static void main(String[] args) {
TestEnum e = TestEnum.SIGNATURE;
System.out.println(e.compareTo(TestEnum.SIGNATURE));
String test = "test";
if (test.equals("test") && e.compareTo(TestEnum.SIGNATURE) != 0) {
System.out.println("I'm here");
}
}
}
我做了以下测试。它不会进入if块并打印“我在这里”。
你可以发布你的片段吗?