写在前面
当EqualsAndHashCode注解在类上,会自动为该类提供 hashCode() 和 equals() 方法。
默认情况下,将使用所有非静态的非 transient 字段生成hashCode() 和 equals() 方法;
可以通过在可选的 exclude 参数中来排除部分字段不;
也可以通过在 parameter 参数中命名它们来准确指定希望使用哪些字段。
如何使用
@Data
// exclude = {"spuId","img"}用于排除spuId和img字段,
// 与直接在字段上加 @EqualsAndHashCode.Exclude功能是一样的。
// of = {"userId", "price"}表示使用哪些字段
@EqualsAndHashCode(callSuper=false, exclude = {"spuId","img"}, of = {"userId", "price"})
public class FavoriteDTO extends BaseDTO {
private Long userId;
// 不包含spuId字段
@EqualsAndHashCode.Exclude
private Long spuId;
private Integer price;
private String title;
private Integer sales;
// 不包含img字段
@EqualsAndHashCode.Exclude
private String img;
private String unit;
private Integer status;
}
@EqualsAndHashCode(callSuper = false)
callSuper的默认值为false,默认情况下仅使用子类中定义的属性来生成 hashCode() 和 equals()方法,且在生成的 hashCode() 和 equals()方法中不会调用父类的方法。
public class Shape {
private Integer id;
private String name;
}
@Data
@EqualsAndHashCode(callSuper=false)
public class Square extends Shape {
private Integer width;
private Integer height;
}
注意:以上代码当id和name不同,其他属性相同时,就会判断是同一个对象,然而实际情况应该是两个不同的对象,那该怎么办呢?很简单:callSuper=true就可以解决该问题。
@EqualsAndHashCode(callSuper = true)
callSuper设置为true,表示使用子类中定义的属性以及父类的属性共同来生成 hashCode() 和 equals()方法,且在生成的 hashCode() 和 equals()方法中会调用父类的方法。
设置原则
A. 如果比较两个对象时需要考虑超类中的成员属性,则使用@EqualsAndHashCode(callSuper=true),才能得到正确的结果;
B. 如果仅使用当前子类中的字段,可以使用@EqualsAndHashCode(callSuper=false),或者不适用此注解,它这就是默认选项;
C. 如果类之间没有继承,仅当在一个类加上@Data时,不会有提示设置:@EqualsAndHashCode(callSuper=false)的警告,否则就会有警告提示。