为什么myEnum.ONE不等于myEnum.ONE.toString()?

时间:2010-08-31 19:58:38

标签: java enums tostring

我有以下枚举:

public enum myEnum {
    ONE("ONE"), TWO("TWO");

    private String name;

    private myEnum(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }
};

我的问题是为什么以下评估为假?我怀疑它与equals()方法的实现有关。

(myEnum.ONE).equals(myEnum.ONE.toString())

3 个答案:

答案 0 :(得分:5)

一般来说,不同类型的对象没有相同的定义,因为为了满足等于契约所规定的对称性,两个类都必须相互了解。

此外,因为平等必须是可传递的(这也是平等合同规定的),引入你的规则会产生奇怪的后果。考虑:

enum Color {
    green, red, blue;
}

enum Experience {
    green, novice, veteran;
}

Color.green应该等于Experience.green吗?可能不是,因为经验和颜色是真正不同的东西。但如果"green".equals(Color.green)"green".equals(Experience.green),则Color.green必须等于Experience.green

所以一般规则是:不相关类型的对象不相等。

答案 1 :(得分:3)

是的,这是equals()方法。对于Enum,它看起来像这样:

public final boolean equals(Object other) { 
    return this==other;
}

现在您的结果很明确:枚举与toString()方法的结果不是同一个对象。

答案 2 :(得分:1)

在你的表达式中,左边的值是枚举。右边的值是一个字符串。

更长的答案是,java中的.equals默认评估为“同一个对象的相同实例”,除非您使用不同的评估形式明确覆盖它。在emum的情况下,它们基本上是语法糖,围绕枚举中每个元素的单个实例值的保证。因此枚举等于查看它是否是相同的元素。

因此,MyENum.ONE是对MyEmum实例的引用,其中只有一个。只要你有一个MyEnum.ONE,它就是同一个实例。如果你问它是否等于它,它只会对MyEnum.ONE实例作出回应。