Lombok用於繼承時應注意的點
阿新 • • 發佈:2018-11-12
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的引數。