先看例子(原始用例来源于这篇文章):
TV类
@Getter
@Setter
//@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
public class TV {
private String id;
private String name;
}
TV的子类
@Getter
@Setter
@EqualsAndHashCode(callSuper = false)
@AllArgsConstructor
@NoArgsConstructor
public class XiaoMiTV extends TV{
private Long price;
private String color;
public XiaoMiTV(String id, String name, Long price, String color) {
super(id, name);
this.price = price;
this.color = color;
}
}
测试方法
XiaoMiTV tv1 = new XiaoMiTV("123", "lxk", 1L, "白");
XiaoMiTV tv2 = new XiaoMiTV("456", "sql", 1L, "白");
System.out.println(tv1.equals(tv2));
结论
1、父类和子类 不写@EqualsAndHashCode注解,equals调用的是Object类的equals方法,比较的是对象的地址。
2、父类写@EqualsAndHashCode注解,子类不写,如果是用包含父类属性的构造函数实例化的,比较的过程中会调用父类的hashcode和equals方法。否则也只会调用Object类的equals方法
3、父类子类都写@EqualsAndHashCode注解,子类callSuper = false,子类的equals和hashcode生成不会调用父类的属性参与,否则参与,默认是不参与
4、我们在使用lombok的@Data注解时,它是一个组合注解,包括@EqualsAndHashCode(callSuper = false)。如果业务要求子类对象相等,还要看父类是不是相等,就需要callSuper = true。否则为false。
5、如果子类的构造函数中的参数没有父类的属性参与,callSuper取值无所谓。如果有,就要考虑语义了。如果有,我一般会严格的设置成true