Conclusiones
Después de analizar los cuatro ejemplos elegidos arbitrariamente de implementaciones de equals (), ¿qué concluimos?
En primer lugar: hay dos formas sustancialmente diferentes de realizar la verificación de la coincidencia de tipos en una implementación de equals (). Una clase puede permitir la comparación de tipos mixtos entre objetos de superclases y subclases mediante el operador instanceof, o una clase puede tratar objetos de diferente tipo como no iguales mediante la prueba getClass (). Los ejemplos anteriores ilustran muy bien que las implementaciones de equals () usando getClass () son generalmente más robustas que aquellas implementaciones que usan instanceof.
La instancia de prueba es correcta solo para las clases finales o si al menos el método equals () es final en una superclase. Esto último implica esencialmente que ninguna subclase debe extender el estado de la superclase, sino que solo puede agregar funcionalidades o campos que son irrelevantes para el estado y el comportamiento del objeto, como los campos transitorios o estáticos.
Las implementaciones que utilizan la prueba getClass (), por otro lado, siempre cumplen con el contrato equals (); Son correctos y robustos. Sin embargo, son semánticamente muy diferentes de las implementaciones que usan la instancia de prueba. Las implementaciones que usan getClass () no permiten la comparación de objetos de subclase con superclase, ni siquiera cuando la subclase no agrega ningún campo y ni siquiera quisiera anular equals (). Tal extensión de clase "trivial" sería, por ejemplo, la adición de un método de impresión de depuración en una subclase definida exactamente para este propósito "trivial". Si la superclase prohíbe la comparación de tipo mixto mediante la comprobación getClass (), la extensión trivial no sería comparable a su superclase. Si este es un problema o no, depende completamente de la semántica de la clase y del propósito de la extensión.
x instanceof SomeClass
es falsa six
esnull
. Por lo tanto, la segunda sintaxis no necesita la comprobación nula.