hashcode java example
Advertencia equals/hashCode en la anotaciĆ³n @Data lombok con herencia (3)
Tengo una entidad que hereda de otra.
Por otro lado, estoy usando el proyecto lombok para reducir el código
@Data
, así que puse la anotación
@Data
.
La anotación
@Data
con herencia produce la siguiente advertencia:
Generando la implementación equals / hashCode pero sin una llamada a la superclase, a pesar de que esta clase no extiende java.lang.Object. Si esto es intencional, agregue
@EqualsAndHashCode(callSuper=false)
a su tipo.
¿Es aconsejable agregar anotaciones
@EqualsAndHashCode (callSuper = true)
o
@EqualsAndHashCode (callSuper = false)
?
Si no se agrega, ¿cuál es
callSuper=false
o
callSuper=true
?
El
valor predeterminado
es
false
.
Ese es el que obtienes si no lo especificas e ignoras la advertencia.
Sí, se recomienda agregar una anotación
@EqualsAndHashCode
en las clases anotadas
@Data
que extienden algo más que Object.
No puedo decirle si necesita
true
o
false
, eso depende de su jerarquía de clases, y tendrá que ser examinado caso por caso.
Sin embargo, para un proyecto o paquete, puede configurar en
lombok.config
para llamar a los súper métodos si no es una subclase directa de Object.
lombok.equalsAndHashCode.callSuper = call
Consulte la
documentación del sistema de configuración
sobre cómo funciona esto y la
documentación de
@EqualsEndHashCode
para las claves de configuración compatibles.
Divulgación: Soy un desarrollador de lombok.
La pregunta original principal es:
¿Es aconsejable agregar anotaciones @EqualsAndHashCode (callSuper = true) o @EqualsAndHashCode (callSuper = false)?
La respuesta aceptada es básicamente solo:
...eso depende...
Para ampliar eso, la documentación en @EqualsAndHashCode tiene una guía sólida para elegir. Especialmente esto, en mi humilde opinión:
Al establecer callSuper en true, puede incluir los métodos equals y hashCode de su superclase en los métodos generados. Para hashCode, el resultado de super.hashCode () está incluido en el algoritmo hash, y los anteriores, el método generado devolverá falso si la súper implementación piensa que no es igual al objeto pasado. Tenga en cuenta que no todas las implementaciones iguales manejan esta situación correctamente. Sin embargo, las implementaciones de igualdad generadas por lombok manejan esta situación correctamente, por lo que puede llamar a su superclase igual de igual si también tiene un método de igualdad generado por lombok.
Para resumir esto un poco: Elija ''callSuper = true'' si está heredando de una superclase que no tiene información de estado, o está utilizando la anotación @Data, o tiene implementaciones de equals / hash que "manejan la situación correctamente" - que interpreto que significa devolver un hash adecuado de los valores de estado.
@EqualsAndHashCode(callSuper=true)
debería resolver la advertencia.