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