为什么Java不允许在枚举中覆盖equals(Object)?

Ash*_*bhu 38 java enums api-design

我注意到以下代码片段......

@Override
public boolean equals(Object otherObject) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

......不允许的枚举,由于该方法equals(Object x)被定义为finalEnum.为什么会这样?

我想不出任何需要覆盖equals(Object)Enum的用例.我只是想知道这种行为背后的原因.

aio*_*obe 41

任何事情return this == other都会违反直觉并违反最不惊讶的原则.equal当且仅当它们是同一个对象并且覆盖此行为的能力容易出错时,预期两个枚举常量.

同样的道理也适用于hashCode(),clone(),compareTo(Object),name(),ordinal(),和getDeclaringClass().


虽然JLS没有激励选择使其成为最终,但在这里的枚举的上下文中提到等于.片段:

equals方法Enum是一个最终方法,只调用super.equals其参数并返回结果,从而执行身份比较.