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

  • 相关阅读:
    docker 安装mysql5.7 加my.cnf
    docker安装redis 配置文件
    私库nexus 配置
    mysql 多个字段建立唯一索引
    scm 一些记录
    tomcat 线程数、NIO配置、内存配置
    为什么简单的一个select查询都要加上事务控制
    powerdeginer report layout
    powerdesigner-连接mysql
    [转载]如何让自己变得有趣
  • 原文地址:https://www.cnblogs.com/xinrong2019/p/13936527.html
Copyright © 2020-2023  润新知