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的參數。源碼

相關文章
相關標籤/搜索