EDITAR
te acabo di cuenta utiliza la igualdad de clases, no instanceof
- lo que significa que la reflexividad habría ser correcta. En su ejemplo, el uso de super.equals
es probablemente correcto, siempre que la superclase no proporcione una definición de igualdad que sea contraria a la que desea su subclase (como Object
, por ejemplo).
El punto principal es que la definición de igualdad debe provenir de exactamente un tipo (clase o interfaz) en la jerarquía de su clase. Si la implementación de esa definición se aprovecha de super.equals
, está bien.
FIN EDITAR, texto original a continuación
Es casi seguro que lo peor que puede hacer, porque violaría la propiedad reflexiva de la igualdad.
Digamos que tiene una Forma, y es igual a otra Forma si son del mismo tipo: Cuadrado es igual a Cuadrado, Círculo es igual a Círculo, etc. Ahora extiende eso para hacer una Plaza de Color que agrega una verificación de color.
Shape shape1 = new Shape(SQUARE);
Shape shape2 = new ColoredShape(SQUARE, RED);
se implementa como ColoredSquare.equals
super.equals(other) && other.color == this.color
, como en su pregunta. Pero ahora, tenga en cuenta que shape1.equals(shape2) == true
(desde shape1
solo usa Shape.equals
), pero shape2.equals(shape1) == false
(ya que agrega la verificación de color).
La moraleja de la historia es que el uso de esta clase de igualdad en cascada es muy difícil, si no imposible. Básicamente, la igualdad debe provenir de exactamente un tipo dentro de la jerarquía de tipo - ya sea Object
, su tipo en sí, un tipo estupendo, o alguna de las interfaces que define un contrato (por ejemplo, en el marco de las colecciones, que definen la igualdad para Set
, List
, etc.)
P.S. Supongo que la clase principal no es Object y está dando la definición correcta de 'equals' y' hashCode'. –