讓人又愛又恨的Lombok,到底該不該用
阿新 • • 發佈:2020-06-16
# 1 簡介
`Lombok`,印尼的一個島嶼,龍目島。但在Java的世界裡,它是一個方便的類庫,能提供很多便利,因此得到許多人的青睞。但也有不少反對聲音。這是為什麼呢?
![龍目島](https://img2020.cnblogs.com/other/946674/202006/946674-20200616134925942-1285845856.jpg)
之前去`龍目島`拍的日落。
# 2 Lombok提供的便利
一般我們在Java中用到`POJO`時,就很容易想到要用`Lombok`,如`VO`、`DTO`、`DO`等。使用`Lombok`需要安裝對應IDE的外掛,同時需要引入依賴:
```xml
```
舉個例子,如果不用`Lombok`,實現`getter/setter`、`equals`、`hashCode`、`toString`程式碼量非常大,如下所示:
```java
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 + '\'' +
'}';
}
}
```
而且大部分是樣板程式碼,沒有太多實際邏輯。
如果使用`Lombok`則非常簡單,一個註解`@Data`就可以完成以上工作(安裝了Lombok外掛後才能顯示右邊的方法):
![](https://img2020.cnblogs.com/other/946674/202006/946674-20200616134927230-2091565930.jpg)
`Lombok`的常用註解有:
`@NonNull`:用於做空指標異常檢測;
`@Cleanup`:自動資源關閉;
`@Getter/@Setter`:自動生成`get/set`方法;
`@ToString`:生成`toString`方法,方便列印除錯;
`@EqualsAndHashCode`:生成`equals`和`hashCode`方法,注意這兩個應該同時去實現;
`@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor`:構造方法;
`@Data`:相當於 `@ToString`+ `@EqualsAndHashCode`+`@Getter`+ `@Setter` +`@RequiredArgsConstructor`。
`@Builder`:生成builder方法;
`@Log`:日誌相關:
```java
@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`確實能給我們帶來極大的便利,減少大量重複、無業務邏輯的程式碼,程式碼顯得比較乾淨;修改了field的名字,不用多處修改;提高開發效率。
# 3 Lombok所帶來的問題
當然,也有人提出了不同意見:
除錯時沒有具體程式碼,不方便Debug;
需要強制別人安裝第三方外掛,不然會顯示報錯;
在檢查測試覆蓋率的時候,無法直觀顯示哪些程式碼已覆蓋和未覆蓋;
無法按自己意願實現,比如`toString`方法,有時需要輸出不一樣的`String`格式,並不一定是按`Lombok`的實現;
對於一些常用的方法,IDE已經可以自動生成,不需要`Lombok`一樣可以高效開發。
![](https://img2020.cnblogs.com/other/946674/202006/946674-20200616134928237-1099783645.jpg)
IDEA沒有提供`Builder`,但可以通過安裝外掛方式使用。
![](https://img2020.cnblogs.com/other/946674/202006/946674-20200616134928743-908221747.jpg)
成功安裝後,就能生成Builder程式碼了:
![](https://img2020.cnblogs.com/other/946674/202006/946674-20200616134929152-64517815.jpg)
# 4 總結
一開始我是支援使用`Lombok`的,經過一段時間使用及出現了一些問題後,我還是覺得通過IDE自動生成程式碼的方式更適合。畢竟強制要求別人安裝外掛這種實在是太野蠻了,而通過IDEA生成程式碼,別人不安裝外掛也不會有報錯。
另外,多幾行程式碼還能體現工作量,哈哈哈哈哈哈......
---
歡迎訪問[南瓜慢說 www.pkslow.com](https://www.pkslow.com/)獲取更多精彩文章!
歡迎關注微信公眾號<**南瓜慢說**>,將持續為你更新...
![](https://img2020.cnblogs.com/other/946674/202006/946674-20200616134929435-1062606460.jpg)
**多讀書,多分享;多寫作,多整理。**