關於Lombok框架子類繼承時EqualsAndHashCode註解的callSuper取值的思考

先看例子(原始用例來源於這篇文章):

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章