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 類,咱們一般須要給每一個屬性寫getter
和setter
,而這種實際上沒有什麼太大的意義。固然,若是有的公司或團隊使用代碼行數評估工做量,仍是多寫幾行吧;同時,能夠考慮一下咱們團隊。java
爲了簡化getter
與setter
,lombok 提供了一種機制,幫助咱們自動生成這些樣板代碼。以上的代碼,若是使用lombok
的話,將變得很簡單:git
@lombok.Getter @lombok.Setter public class A { private int a; private String b; }
顧名思義,lombok.Getter
就是生成getter
,lombok.Setter
就是生成setter
。可是,這樣真的就能夠了麼?編譯下,讓咱們看看生成的二進制代碼。(請自行下載lombok.jar
)github
命令行> javac -cp lombok.jar A.java 命令行> javap -c A.class
輸出結果略。能夠看到徹底同樣。eclipse
更進一步,若是在編譯的時候,加入-g:none
選項,甚至能夠看到生成的文件徹底同樣。maven
雖然咱們能夠在編譯的時候,加入classpath
,可是,通常來講,在各種IDE
中使用,仍是須要特殊處理一下。ide
加上依賴就好。同時,因爲lombok
只在編譯期才處理,因此並不須要在運行時有這個依賴,能夠把scope
定義爲provided
。工具
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.8</version> <scope>provided</scope> </dependency> </dependencies>
值得注意的是,maven
的maven-compiler-plugin
低版本和lombok
高版本不兼容,目前已知maven-compiler-plugin
的2.3.X
與lombok
的1.6.X
不兼容。這個須要瞭解lombok
的原理才能進一步說明。ui
因爲eclipse
的默認編譯器並非javac
,因此,須要額外安裝,基本就是改下引導參數,能夠直接運行jar
包,或者手動在eclipse.ini
里加上參數-Xbootclasspath/a:lombok.jar -javaagent:lombok.jar
。this
雖然IDEA IntelliJ
默認使用javac
做爲編譯器,理論上能夠不裝插件。但是,跳轉等特性也隨之沒了。因此,仍是安裝個插件吧,直接去倉庫裏搜索lombok
就成。spa
若是項目中使用高級配置,須要額外注意一下。雖然在編譯的時候,lombok
配置文件能夠在任何能找到的目錄,可是,lombok-intellij
插件默認並不支持在任何目錄,若是有配置文件,建議放在java
的源代碼根目錄中。
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
仍是認爲沒有使用這些變量。能夠後向移植這些包,或者應用單獨的補丁。
呃,真的有人想看原理麼?若是想,請留言,之後再發。
lombok, lombok 官網,可是,目前沒有發現哪裏能夠捐贈
sonar, sonar 官網,對代碼規範有一些建議
sonar-java, sonar-java 低版本插件,支持lombok