Java比较枚举器(奇怪的行为)

时间:2011-06-15 15:08:23

标签: java eclipse enums

我使用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)--->假

     

签署--->真

为什么?!?

这怎么可能?

5 个答案:

答案 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块并打印“我在这里”。

你可以发布你的片段吗?