一個在編譯階段修改加強Java類的工具,使用方式基於註解,經常使用於:java
項目中是否引入Lombok一直是個存在爭議,它的主要優點在於消除Java類的部分臃腫代碼,提升開發效率,下降代碼維護成本;缺點是須要IDE插件支持,須要團隊統一規範,另外某些註解生成的隱性實現可能致使問題跟蹤調試困難。git
不使用Lombok,IDE也能夠自動生成getter,setter代碼,但Lombok除了getter,setter還有@Builder和@SuperBuilder等很是實用的自動實現。好比你能夠將一個POJO類轉化爲builder模式,若是你又有一個子類,子類的構造器還要繼承自父類,寫起來就費勁了。而經過Lombok只須要一個@SuperBuilder註解(v1.18.2+版本支持)。github
compile("org.projectlombok:lombok:1.18.4")
示例代碼:框架
public class Parent { // get,set添加在指定屬性上 @Getter @Setter private int id; @Getter @Setter private String name; }
在類上添加的註解:函數
- @Data 註解組合,含@Setter、@Getter、@RequiredArgsConstructor、@EqualsAndHashCode等註解 - 構造函數註解: @NoArgsConstructor、@AllArgsConstructor、@RequiredArgsConstructor - 構造器builder註解: @Builder、@SuperBuilder - 日誌聲明的註解: @Slf4j 等
示例代碼:工具
@Data public class Child extends Parent { private String ext; }
@Setter@Getter或@Data註解添加後能夠經過new建立對象並調用getter,setter方法:gradle
Child c1 = new Child(); c1.setId(1); System.out.println(c1.getId());
構造模式的鏈式調用寫起來很方便,本身實現構造模式要在POJO類中寫較多代碼,尤爲是須要繼承父類的builder時。
Lombok的@Builder註解能夠方便的支持構造模式
示例代碼:ui
@Builder public class Child extends Parent { private String ext; }
調用方法:spa
Child c1 = Child.builder().ext("子類屬性ext").build(); System.out.println(c1.getExt());
此例中的鏈式調用僅有ext()屬性,即便給父類Parent也添加@Builder註解也依然不能鏈式調用id()和name(),本身去寫builder的實現也是這樣,類是繼承的,但類中的builder並沒有繼承關係,而實際開發場景中咱們通常都須要讓子類的builder繼承父類builder的行爲。插件
Lombok在v1.18.2版本中針對這個問題增長了@SuperBuilder註解,子類和父類中都添加@SuperBuilder註解,子類builder便可繼承父類builder。
代碼示例:
@SuperBuilder public class Parent { // get,set添加在指定屬性上 @Getter @Setter private int id; //若是須要讓build出的對象屬性使用默認值,須要添加@Builder.Default註解 @Builder.Default @Getter @Setter private String name = "unknown"; } @SuperBuilder @Data public class Child extends Parent { private String ext; }
調用示例:
Child c1 = Child.builder().id(1).name("名稱").ext("子類屬性ext").build(); System.out.println(c1.getId());
須要注意的是: 關於builder的繼承,Lombok Plugin還沒有更新支持@SuperBuilder,因此以上寫法在IDE下還會提示編譯錯誤,等更新吧,或者用稍微蹩腳一點的解決方案:Lombok’s @Builder annotation and inheritance