途牛原創|使用 lombok 簡化 Java 代碼

一個典型的 Java 類

public class A {

  private int a;

  private String b;

  public int getA() {
    return a;
  }

  public String getB() {
    return b;
  }

  public void setA(int a) {
    this.a = a;
  }

  public void setB(String b) {
    this.b = b;
  }

}

對於這樣一個簡單的 Java 類,咱們一般須要給每一個屬性寫gettersetter,而這種實際上沒有什麼太大的意義。固然,若是有的公司或團隊使用代碼行數評估工做量,仍是多寫幾行吧;同時,能夠考慮一下咱們團隊。java

使用 lombok,簡化代碼

爲了簡化gettersetter,lombok 提供了一種機制,幫助咱們自動生成這些樣板代碼。以上的代碼,若是使用lombok的話,將變得很簡單:git

@lombok.Getter
@lombok.Setter
public class A {

    private int a;

    private String b;

}

顧名思義,lombok.Getter就是生成getterlombok.Setter就是生成setter。可是,這樣真的就能夠了麼?編譯下,讓咱們看看生成的二進制代碼。(請自行下載lombok.jar)github

命令行> javac -cp lombok.jar A.java
命令行> javap -c A.class

輸出結果略。能夠看到徹底同樣。eclipse

更進一步,若是在編譯的時候,加入-g:none選項,甚至能夠看到生成的文件徹底同樣。maven

簡單使用

雖然咱們能夠在編譯的時候,加入classpath,可是,通常來講,在各種IDE中使用,仍是須要特殊處理一下。ide

Maven

加上依賴就好。同時,因爲lombok只在編譯期才處理,因此並不須要在運行時有這個依賴,能夠把scope定義爲provided工具

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.8</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

值得注意的是,mavenmaven-compiler-plugin低版本和lombok高版本不兼容,目前已知maven-compiler-plugin2.3.Xlombok1.6.X不兼容。這個須要瞭解lombok的原理才能進一步說明。ui

Eclipse

因爲eclipse的默認編譯器並非javac,因此,須要額外安裝,基本就是改下引導參數,能夠直接運行jar包,或者手動在eclipse.ini里加上參數-Xbootclasspath/a:lombok.jar -javaagent:lombok.jarthis

IDEA IntelliJ

雖然IDEA IntelliJ默認使用javac做爲編譯器,理論上能夠不裝插件。但是,跳轉等特性也隨之沒了。因此,仍是安裝個插件吧,直接去倉庫裏搜索lombok就成。spa

若是項目中使用高級配置,須要額外注意一下。雖然在編譯的時候,lombok配置文件能夠在任何能找到的目錄,可是,lombok-intellij插件默認並不支持在任何目錄,若是有配置文件,建議放在java的源代碼根目錄中。

更多 lombok 註解

lombok 目前最新版本爲 1.16.8,我的以爲比較經常使用的有如下幾種,更多請查看官網。

  • @val

若是你要定義一個final的變量,而且不想寫類型,這個能夠幫到你。可是,在實際項目中,徹底沒有使用到。

  • @NonNull

這個在參數中使用,若是調用時傳了null,就直接拋空指針。

  • @Data

@ToString@EqualsAndHashCode@Getter@Setter@RequiredArgsConstructor註解的集合。

  • @Getter@Setter

做用於屬性和類上,自動生成屬性的getXXX()setXXX()方法。若在類上,則對全部屬性有效。並可經過AccessLevel參數控制方法的訪問級別。

  • @ToString

做用於類,自動重寫類的ToString()方法。經常使用的參數有exclude(指定方法中不包含的屬性)、callSuper(方法中是否包含父類ToString()方法返回的值)

  • @EqualsAndHashCode

做用於類,自動重寫類的equals()hashCode()方法。經常使用的參數有exclude(指定方法中不包含的屬性)、callSuper(方法中是否包含父類ToString()方法返回的值)

  • @NoArgsConstructor, @RequiredArgsConstructor@AllArgsConstructor

做用於類,@NoArgsConstructor自動生成不帶參數的構造方法;@RequiredArgsConstructor自動生成帶參數的構造方法,主要針對一些須要特殊處理的屬性,好比未初始化的final屬性;@AllArgsConstructor自動生成包含全部屬性的構造方法。

  • @Synchronized

做用於方法,可鎖定指定的對象,若是不指定,則默認建立建立一個對象鎖定。

  • @Log,或者直接@Slf4j

做用於類,具體包含@CommonsLog@Log@Log4j@Log4j2@Slf4j@XSlf4j,分別對用不一樣的日誌系統。利用此類註解,可爲類建立一個log屬性。

sonar源碼審查

sonar是一個源碼審查工具。最新版5.X已經支持lombok的所有註解,再也不認爲是沒有使用的變量。可是,舊的4.X仍是認爲沒有使用這些變量。能夠後向移植這些包,或者應用單獨的補丁。

原理

呃,真的有人想看原理麼?若是想,請留言,之後再發。

參考文獻

  1. lombok, lombok 官網,可是,目前沒有發現哪裏能夠捐贈

  2. sonar, sonar 官網,對代碼規範有一些建議

  3. sonar-java, sonar-java 低版本插件,支持lombok

相關文章
相關標籤/搜索