• Lombok 继承时应注意的点


    lombok项目的产生就是为了省去我们手动创建getter和setter等基本方法的麻烦,它能够在我们编译源码的时候自动帮我们生成getter和setter等方法。即它最终能够达到的效果是:在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法

    关于lombok基础的使用特性,参考这篇文章

    继承时的@Data

    我们知道@Data注解在类,为类的所有字段注解@ToString、@EqualsAndHashCode、@Getter的便捷方法,同时为所有非final字段注解@Setter。

    要注意@EqualsAndHashCode注解与@ToString注解默认情况下是忽略父类的成员变量的,测试代码如下:

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class School {
    
      public int id;
    
      public String name;
    
      public String age;
    
    }
    
    @Data
    class ShangHai extends School {
      private String type;
    }
    
    
    class test {
    
      public static void main(String[] args) {
        ShangHai shangHai = new ShangHai();
        shangHai.setId(1);
        shangHai.setName("上海大学");
        shangHai.setType("A");
    
        ShangHai shangHai2 = new ShangHai();
        shangHai2.setId(2);
        shangHai2.setName("华东师范");
        shangHai2.setType("A");
    
        System.out.println(shangHai.equals(shangHai2));
        System.out.println(shangHai.toString());
        System.out.println(shangHai2.toString());
    
      }
    }
    

    它的打印结果是:

    true
    ShangHai(type=A)
    ShangHai(type=A)
    

    在此可以发现,上述的两个实例没有对比父类的成员变量是否相同,仅仅对比的type字段的值,所以是true。同理,toString方法是不会打印父类的成员的。

    使父类成员变量参与到逻辑中

    这个解决很简单,仅仅需要给注解带上一个参数:

    @Data
    @ToString(callSuper = true)
    @EqualsAndHashCode(callSuper = true)
    class ShangHai extends School {
      private String type;
    }
    

    打印结果

    true
    ShangHai(super=School(id=1, name=上海大学, age=null), type=A)
    ShangHai(super=School(id=2, name=华东师范, age=null), type=A)
    

    小结

    由上述的代码演示,我们可以知道,在类继承的情况时应注意@Data注解不会涉父类的成员的坑,需要加callSuper = true的参数。

  • 相关阅读:
    下雪诗
    华视身份证阅读器100UC HTTP模式二次开发
    C# Action 和 Func 区别
    网站部署——文件系统
    前端-JavaScript DOM和BOM
    IO多路复用
    python-协程
    python-线程
    python-进程
    计算机与操作系统简介
  • 原文地址:https://www.cnblogs.com/keeya/p/9948941.html
Copyright © 2020-2023  润新知