¿Por qué Java no permite anular Iguales (Objeto) en un Enum?

Me di cuenta de que el siguiente fragmento …

@Override public boolean equals(Object otherObject) { ... } 

… no está permitido para un Enum, ya que el método equals(Object x) se define como final en Enum . ¿Por qué esto es tan?

No puedo pensar en ningún caso de uso que requiera reemplazar los equals(Object) para Enum. Solo tengo curiosidad por saber el razonamiento detrás de este comportamiento.

Cualquier cosa menos return this == other sería contrario a la intuición y violaría el principio de menos asombro . Se espera que dos constantes enum sean equal si y solo si son el mismo objeto y la capacidad de anular este comportamiento sería propenso a errores.

El mismo razonamiento se aplica a hashCode() , clone() , compareTo(Object) , name() , ordinal() y getDeclaringClass() .


Mientras que el JLS no motiva la elección de hacerlo final, sino que menciona iguales en el contexto de enumeraciones aquí . Retazo:

El método equals en Enum es un método final que simplemente invoca super.equals en su argumento y devuelve el resultado, realizando así una comparación de identidad.

Ya existe una fuerte noción intuitiva de lo que significa que las instancias (valores) de una enum sean iguales. Permitir que se sobrecargue el método equals llevaría a que esa noción sea violada, lo que llevará a comportamientos inesperados, errores, etc.

Es precisamente porque los diseñadores de Java no podían pensar en ningún caso de uso concebible para anular Enum.equals (Object) que ese método se declarara como definitivo, por lo que dicha anulación sería imposible.

Debo confesar que las enumeraciones son lo último que me gustaría anular equals() en.

Creo que la razón equals() es definitiva en las enumeraciones es que Java estimula == para la comparación enum, y la implementación de equals() en las enumeraciones simplemente lo usa, por lo que permitir que equals() se anule es evitar == y equals() de comportarse de manera diferente, que es algo que otros desarrolladores no esperarían.

    Intereting Posts