¿Por qué la adición de Lombok método canEqual

user7294900:

Al utilizar Lombok @Data (que añade EqualsAndHashCode )

Se agrega canEqualel 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?

cassiomolin:

El canEqualmé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(y hashCode), 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étodo canEquala todas las clases que redefine equals.


Parece que se introdujo en Lombok 0,10, como se describe en la @EqualsAndHashCodedocumentación:

NUEVO en Lombok 0,10: A menos que su clase es finaly se extiende java.lang.Object, Lombok genera un canEqualmé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 equalsmétodos, debe reemplazar siempre canEqualsi cambia equalsy hashCode.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=312603&siteId=1
Recomendado
Clasificación