我注意到以下代码片段...
@Override
public boolean equals(Object otherObject) {
...
}
枚举类型不允许重写equals(Object x)
方法,因为该方法在Enum
中被定义为final
。为什么会这样呢?
我无法想象出任何需要重写equals(Object)
方法的枚举用例。只是好奇这种行为背后的原因。
我注意到以下代码片段...
@Override
public boolean equals(Object otherObject) {
...
}
枚举类型不允许重写equals(Object x)
方法,因为该方法在Enum
中被定义为final
。为什么会这样呢?
我无法想象出任何需要重写equals(Object)
方法的枚举用例。只是好奇这种行为背后的原因。
对于一个enum
类型的实例(值)相等已经有了强烈的直觉概念。允许重载equals
方法将导致这种概念被违反,从而导致意外行为、错误等问题。
public enum Channel
{
CallCenter("Call Center"),
BankInternal("Bank Internal"),
Branch("Branch");
private final String value;
Channel(String value)
{
this.value = value;
}
@Override
public String toString()
{
return value;
}
public static Channel valueOf(String value)
{
for (Channel c : Channel.values())
if (c.value.equals(value))
return c;
return null;
}
@Override
public boolean equals(Object other)
{
if (other instanceof String)
other = Channel.valueOf((String)other);
return super.equals(other);
}
}
public boolean equals (Object object) {
if (object == this) return true;
if (object instanceof Enum)
object = object.toString();
if (object instanceof String) {
String s = (String)object;
// There was a time hole between first read of s.hashCode and second read
// if another thread does hashcode computing for incoming string object
if (count != s.count ||
(hashCode != 0 && s.hashCode != 0 && hashCode != s.hashCode))
return false;
return regionMatches(0, s, 0, count);
}
return false;
}
正是因为Java设计者无法想象重写Enum.equals(Object)的任何可行用例,所以该方法被声明为final - 以使这样的重写成为不可能。
我必须承认,在枚举类中覆盖equals()
是我最不想做的事情。
我认为枚举类中equals()
被设置为final的原因是Java鼓励使用==
进行枚举比较,而在枚举类中实现equals()
只是简单地使用它,所以防止覆盖equals()
可以避免==
和equals()
的行为不同,这是其他开发人员不期望看到的。
MY_ENUM.VALUE.equals("hello")
而不是MY_ENUM.VALUE.toString().equals("hello")
。希望这样讲清楚了。 - zundi