zoukankan      html  css  js  c++  java
  • 关于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

  • 相关阅读:
    javaweb常识
    分页功能的实现
    登录按钮的美化
    如何将数据库中的值经过servlet传入到jsp页面,并且用EL表达式显示出值
    获取当前系统时间添加到对象中
    导航栏/菜单栏的设置
    验证码的设计与记住我存储用户名密码cookie的技术及单选按钮选择登录人身份的实现
    div悬浮窗口设计来完成注册页面
    jdbc封装的类
    ajax验证用户名是否存在
  • 原文地址:https://www.cnblogs.com/xinrong2019/p/13936527.html
Copyright © 2011-2022 走看看