lombok項目的產生就是爲了省去咱們手動建立getter和setter等基本方法的麻煩,它可以在咱們編譯源碼的時候自動幫咱們生成getter和setter等方法。即它最終可以達到的效果是:在源碼中沒有getter和setter方法,可是在編譯生成的字節碼文件中有getter和setter方法html
關於lombok基礎的使用特性,參考這篇文章。java
咱們知道@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的參數。源碼