1 簡(jiǎn)介
Lombok,印尼的一個(gè)島嶼,龍目島。但在JAVA的世界里,它是一個(gè)方便的類庫(kù),能提供很多便利,因此得到許多人的青睞。但也有不少反對(duì)聲音。這是為什么呢?

之前去龍目島拍的日落。
2 Lombok提供的便利
一般我們?cè)贘ava中用到POJO時(shí),就很容易想到要用Lombok,如VO、DTO、DO等。使用Lombok需要安裝對(duì)應(yīng)IDE的插件,同時(shí)需要引入依賴:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
舉個(gè)例子,如果不用Lombok,實(shí)現(xiàn)getter/setter、equals、hashCode、toString代碼量非常大,如下所示:
package com.pkslow.basic.lombok;
import java.util.Objects;
public class Book {
private String name;
private int id;
private double price;
private String author;
private String desc;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book book = (Book) o;
return id == book.id &&
Double.compare(book.price, price) == 0 &&
Objects.equals(name, book.name) &&
Objects.equals(author, book.author) &&
Objects.equals(desc, book.desc);
}
@Override
public int hashCode() {
return Objects.hash(name, id, price, author, desc);
}
@Override
public String toString() {
return "Book{" +
"name='" + name + ''' +
", id=" + id +
", price=" + price +
", author='" + author + ''' +
", desc='" + desc + ''' +
'}';
}
}
而且大部分是樣板代碼,沒(méi)有太多實(shí)際邏輯。
如果使用Lombok則非常簡(jiǎn)單,一個(gè)注解@Data就可以完成以上工作(安裝了Lombok插件后才能顯示右邊的方法):

Lombok的常用注解有:
@NonNull:用于做空指針異常檢測(cè);
@Cleanup:自動(dòng)資源關(guān)閉;
@Getter/@Setter:自動(dòng)生成get/set方法;
@ToString:生成toString方法,方便打印調(diào)試;
@EqualsAndHashCode:生成equals和hashCode方法,注意這兩個(gè)應(yīng)該同時(shí)去實(shí)現(xiàn);
@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor:構(gòu)造方法;
@Data:相當(dāng)于 @ToString+ @EqualsAndHashCode+@Getter+ @Setter +@RequiredArgsConstructor。
@Builder:生成builder方法;
@Log:日志相關(guān):
@CommonsLog:org.Apache.commons.logging.LogFactory.getLog(LogExample.class);
@Flogger:com.google.common.flogger.FluentLogger.forEnclosingClass();
@JBossLog:org.jboss.logging.Logger.getLogger(LogExample.class);
@Log:java.util.logging.Logger.getLogger(LogExample.class.getName());
@Log4j:org.apache.log4j.Logger.getLogger(LogExample.class);
@Log4j2:org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
@Slf4j:org.slf4j.LoggerFactory.getLogger(LogExample.class);
@XSlf4j:org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
@CustomLog:com.foo.your.LoggerFactory.createYourLogger(LogExample.class);
所以Lombok確實(shí)能給我們帶來(lái)極大的便利,減少大量重復(fù)、無(wú)業(yè)務(wù)邏輯的代碼,代碼顯得比較干凈;修改了field的名字,不用多處修改;提高開發(fā)效率。
3 Lombok所帶來(lái)的問(wèn)題
當(dāng)然,也有人提出了不同意見(jiàn):
調(diào)試時(shí)沒(méi)有具體代碼,不方便Debug;
需要強(qiáng)制別人安裝第三方插件,不然會(huì)顯示報(bào)錯(cuò);
在檢查測(cè)試覆蓋率的時(shí)候,無(wú)法直觀顯示哪些代碼已覆蓋和未覆蓋;
無(wú)法按自己意愿實(shí)現(xiàn),比如toString方法,有時(shí)需要輸出不一樣的String格式,并不一定是按Lombok的實(shí)現(xiàn);
對(duì)于一些常用的方法,IDE已經(jīng)可以自動(dòng)生成,不需要Lombok一樣可以高效開發(fā)。

IDEA沒(méi)有提供Builder,但可以通過(guò)安裝插件方式使用。

成功安裝后,就能生成Builder代碼了:

4 總結(jié)
一開始我是支持使用Lombok的,經(jīng)過(guò)一段時(shí)間使用及出現(xiàn)了一些問(wèn)題后,我還是覺(jué)得通過(guò)IDE自動(dòng)生成代碼的方式更適合。畢竟強(qiáng)制要求別人安裝插件這種實(shí)在是太野蠻了,而通過(guò)IDEA生成代碼,別人不安裝插件也不會(huì)有報(bào)錯(cuò)。
另外,多幾行代碼還能體現(xiàn)工作量,哈哈哈哈哈哈......