1. 程式人生 > >Lombok用於繼承時應注意的點

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的引數。