1. 程式人生 > >讓人又愛又恨的Lombok,到底該不該用

讓人又愛又恨的Lombok,到底該不該用

# 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) **多讀書,多分享;多寫作,多整理。**