关于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

原文地址:https://www.cnblogs.com/xinrong2019/p/13936527.html