先看例子(原始用例來源於這篇文章):
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