Al utilizar Lombok @Data (que añade EqualsAndHashCode )
Se agrega canEqual
el método
protected boolean canEqual(Object other) { return other instanceof Exercise; }
que sólo se llama una vez:
if (!other.canEqual((Object)this)) return false;
Busco y encontré las discusiones sobre el nivel de acceso
Si implementa iguales y hashCode en una clase no final lo más seguro que podemos hacer es añadir la puede igualar la forma de hacer. Dado que no añadimos ningún campo de los costes, sobre todo si se protege el método, son escasas.
Pero ¿por qué necesitamos este método genera? No puede ser en línea?
El canEqual
método se define en un documento titulado Cómo escribir un método de Igualdad en Java . Este método está pensado para permitir a la igualdad redefinen en varios niveles de la jerarquía de clases , manteniendo su contrato:
La idea es que tan pronto como un redefine la clase
equals
(yhashCode
), sino que también debe explícitamente establecen que los objetos de esta clase, nunca es igual a objetos de alguna superclase que implementan un método diferente de igualdad. Esto se logra mediante la adición de un métodocanEqual
a todas las clases que redefineequals
.
Parece que se introdujo en Lombok 0,10, como se describe en la @EqualsAndHashCode
documentación:
NUEVO en Lombok 0,10: A menos que su clase es
final
y se extiendejava.lang.Object
, Lombok genera uncanEqual
método que significa proxies de la APP todavía puede ser igual a su clase base, pero subclases que añaden nuevo estado no es igual a romper el contrato.
Y la documentación va un poco más lejos, haciendo referencia al documento citado más arriba:
Las razones complicadas por las cuales un procedimiento de este tipo es necesario se explican en este documento: Cómo escribir un método de Igualdad en Java . Si todas las clases en una jerarquía son una mezcla de clases de caso Scala y clases con generada Lombok-métodos equals, toda la Igualdad 'sólo trabajo'. Si tiene que escribir sus propios
equals
métodos, debe reemplazar siemprecanEqual
si cambiaequals
yhashCode
.