近來偶遇一款擼碼神器,介紹給你們~
相信許多小夥伴都深有體會,POJO類中的千篇一概的getter/setter,constructor等方法讓人寫的揪心,那麼今天就有一種方法能夠殘暴的解決這個問題。
接下來爲你們介紹這款神器:Lombok
如下是官方對Lombok的介紹java
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
Project Lombok是一個java庫,它能夠自動插入編輯器和構建工具,爲java增色。永遠不要再編寫另外一個getter或equals方法,使用一個註釋,您的類就有了一個功能齊全的構建器、自動記錄變量等等。
簡而言之,Lombok實現的效果就是經過簡單的註解來精簡代碼達到消除冗長代碼的目的。git
對Lombok有了一個基本的認識以後,讓咱們來挖掘一下它的優缺點。首先看一下它的優勢。github
以上就是Lombok的優勢,固然,Lombok的優勢遠遠不止以上幾點,使用Lombok,你能夠更加優雅高效的編輯代碼。但,俗話說「有利必有弊」,Lombok爲咱們帶來便利的同時也帶來的很多小麻煩。eclipse
雖然Lombok有着很多缺點,但總歸是利大於弊,做爲一款優秀的神器,仍然值得咱們去學習。編輯器
授人以魚不如授人以漁,接下來簡要介紹一下Lombok的原理。ide
Sun公司在2005.2.1提交了JSR 269,用於支持在編譯期對annotation進行處理,即引入了插入式註解處理API(Pluggable Annotation Processing API)。javac從java6開始支持「JSR 269 API」規範,只要程序實現了該API,就能在javac運行的時候獲得調用,而Lombok實現了「JSR 269 API」,在編譯時,javac編譯源碼的具體流程以下:Source File -> Parse -> AST -> Annotation Processing -> Modified AST -> Analyze and Generate -> Byte Code
在項目中引入Lombok的方法有不少,在此以Maven爲例進行講解,其餘途徑能夠參考官方網站https://projectlombok.org/
。
打開pom.xml文件,添加如下依賴。工具
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> <scope>provided</scope> </dependency>
在上面提到,Lombok須要額外的環境配置,此處以IDEA爲例進行講解。學習
File -> Settings -> Plugins
,輸入Lombok Plugin
點擊搜索。完成了上述準備以後,就能夠愉快的使用Lombok進行編碼了。編碼以前首先爲你們介紹一下Lombok的基本用法。網站
@Data
包含了 @Getter @Setter @ToString @EqualsAndHashCode
即自動爲類生成全部getter、setter、toString、eaquals以及hashCode方法@Getter 爲全部屬性生成public修飾的get方法
@Getter(AccessLevel.PROTECTED) 爲全部屬性生成protected修飾的get方法ui@Setter 爲全部屬性生成public修飾的set方法
@Setter(AccessLevel.PROTECTED) 爲全部屬性生成protected修飾的set方法@NoArgsConstructor 無參構造器
@AllArgsConstructor 生成帶有全部屬性的有參構造器@ToString 默認生成帶有全部屬性的toString方法
@ToString(exclude = "column") 生成除column
屬性以外的全部屬性的toString方法
@ToString(exclude = {"column1", "column2"})
@ToString(of = "column") 生成只有column
屬性的toString方法
@ToString(of = {"column1", "column2"})@EqualsAndHashCode
@EqualsAndHashCode(exclude = "column") 以column
屬性以外的屬性做爲是不是相同對象判斷的標準
@EqualsAndHashCode(of = "column")) 只以column
屬性做爲是不是相同對象判斷的標準@Slf4j 爲當前類生成日誌對象
@Log4j 爲當前類生成日誌對象
接下來讓咱們簡單對比一下代碼。
首先是未經簡化的代碼。
public class User { private Integer id; private String username; private String password; private String email; private String phone; public User(Integer id, String username, String password, String email, String phone) { this.id = id; this.username = username; this.password = password; this.email = email; this.phone = phone; } public User() { } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return Objects.equals(id, user.id) && Objects.equals(username, user.username) && Objects.equals(password, user.password) && Objects.equals(email, user.email) && Objects.equals(phone, user.phone); } @Override public int hashCode() { return Objects.hash(id, username, password, email, phone, question, answer, role, createTime, updateTime); } }
接下來是使用Lombok簡化後的代碼。
@Getter @Setter @NoArgsConstructor @AllArgsConstructor public class User { private Integer id; private String username; private String password; private String email; private String phone; }
Lombok的更多用法,在此再也不贅述,等待你們去慢慢發掘。
Lombok雖然好用,但推薦你們選擇適合的地方使用Lombok,例如POJO是一個好地方,由於POJO很單純。
若是有小夥伴想要深究Lombok是如何實現插入式註解的,能夠利用反編譯大法查看源碼。
在此推薦另外一款神兵利器 Java Decompiler
。
官方網站爲:http://java-decompiler.github.io/
有如下三種安裝方式:
安裝完成後能夠經過Java Decompiler驗證Class文件。