Lombok 继承时应注意的点

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

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

继承时的@Data

咱们知道@Data注解在类,为类的全部字段注解@ToString、@EqualsAndHashCode、@Getter的便捷方法,同时为全部非final字段注解@Setter。测试

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

@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());

  }
}

它的打印结果是:htm

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

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

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

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

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

打印结果get

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

小结

由上述的代码演示,咱们能够知道,在类继承的状况时应注意@Data注解不会涉父类的成员的坑,须要加callSuper = true的参数。源码

相关文章
相关标签/搜索