Why Java does not allow overriding equals(Object) in an Enum?

api-design, enums, java

Solution

Anything but `return this == other` would be counter intuitive and violate the principle of least astonishment. Two enum constants are expected to be `equal` if and only if they are the same object and the ability to override this behavior would be error prone.

Same reasoning applies to `hashCode()`, `clone()`, `compareTo(Object)`, `name()`, `ordinal()`, and `getDeclaringClass()`.

The JLS does not motivate the choice of making it final, but mentions equals in the context of enums here. Snippet:

The equals method in `Enum` is a final method that merely invokes `super.equals` on its argument and returns the result, thus performing an identity comparison.

Problem

I've noticed that the following snippet... ``` @Override public boolean equals(Object otherObject) { ... } ``` ...is not allowed for an Enum, since the method `equals(Object x)` is defined as `final` in `Enum`. Why is this so? I cannot think of any use case which would require overriding `equals(Object)` for Enum. I'm just curious to know the reasoning behind this behavior.

Original source