2010-06-03 17 views
33

me he dado cuenta de que el siguiente fragmento ...¿Por qué Java no permite la anulación de iguales (Objeto) en un Enum?

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

... no está permitido para una enumeración, 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 anular equals(Object) para Enum. Solo tengo curiosidad por saber el razonamiento detrás de este comportamiento.

Respuesta

33

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

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


Mientras que el JLS no motiva la elección de lo que es final, pero es igual menciona en el contexto de las enumeraciones here. Fragmento:

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

0

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

3

Ya existe una fuerte noción intuitiva de lo que significa que las instancias (valores) de un enum sean iguales. Permitir la sobrecarga del método equals llevaría a que esa noción se viole, lo que llevaría a comportamientos inesperados, errores, etc.

0

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

Creo que la razón equals() es definitiva en enumeraciones es que Java anima == para la comparación de enumeración, y la implementación de equals() en enumeraciones simplemente lo usa, por lo que equals() se reemplaza para evitar que == y equals() se comporten de manera diferente, que es algo que otros desarrolladores no esperarían.

Cuestiones relacionadas