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

  • 相关阅读:
    [BZOJ1143/2718]祭祀river/毕业旅行
    [BZOJ4403]序列统计
    [BZOJ2006][NOI2010]超级钢琴
    [BZOJ2005][NOI2010]能量采集
    [BZOJ3631][JLOI2014]松鼠的新家
    第一个spring,总结!
    第一个spring,第五天。
    第一次spring,第三天。
    第一个spring,第一天。
    软件工程课程设计——第一个Spring
  • 原文地址:https://www.cnblogs.com/xinrong2019/p/13936527.html
Copyright © 2020-2023  润新知