我有以下枚举:
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())
答案 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实例作出回应。