Lombok經常使用註解的使用總結

Lombok是什麼?

一個在編譯階段修改加強Java類的工具,使用方式基於註解,經常使用於:java

  • 爲Java POJO生成屬性對應的getter,setter等
  • 爲Java POJO生成builder構造器模式的實現
  • 爲Java類自動添加其餘重複性代碼,好比日誌記錄的聲明代碼能夠經過@Slf4j註解添加

項目中是否引入Lombok一直是個存在爭議,它的主要優點在於消除Java類的部分臃腫代碼,提升開發效率,下降代碼維護成本;缺點是須要IDE插件支持,須要團隊統一規範,另外某些註解生成的隱性實現可能致使問題跟蹤調試困難。git

不使用Lombok,IDE也能夠自動生成getter,setter代碼,但Lombok除了getter,setter還有@Builder和@SuperBuilder等很是實用的自動實現。好比你能夠將一個POJO類轉化爲builder模式,若是你又有一個子類,子類的構造器還要繼承自父類,寫起來就費勁了。而經過Lombok只須要一個@SuperBuilder註解(v1.18.2+版本支持)。github

如何引入Lombok

  • 引入依賴,以gradle爲例:
compile("org.projectlombok:lombok:1.18.4")
  • IDE中安裝插件,以IDEA爲例: Settings -> Plugins -> 搜索Lombok Plugin,點擊安裝

圖片描述

  • IDEA中配置啓用註解的處理: Enable annotation processing (不開啓將致使編譯錯誤)

圖片描述

Lombok常見用法

  • 在屬性上添加的註解: @Getter、@Setter、@NonNull等:

示例代碼:框架

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());

Builder構造器模式與繼承

構造模式的鏈式調用寫起來很方便,本身實現構造模式要在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


Diboot - 簡單高效的輕代碼開發框架

相關文章
相關標籤/搜索