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

1 簡介

Lombok,印尼的一個島嶼,龍目島。但在Java的世界里,它是一個方便的類庫,能提供很多便利,因此得到許多人的青睞。但也有不少反對聲音。這是為什麼呢?

之前去龍目島拍的日落。

2 Lombok提供的便利

一般我們在Java中用到POJO時,就很容易想到要用Lombok,如VODTODO等。使用Lombok需要安裝對應IDE的插件,同時需要引入依賴:

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.10</version>
  <scope>provided</scope>
</dependency>

舉個例子,如果不用Lombok,實現getter/setterequalshashCodetoString代碼量非常大,如下所示:

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插件后才能显示右邊的方法):

Lombok的常用註解有:

@NonNull:用於做空指針異常檢測;

@Cleanup:自動資源關閉;

@Getter/@Setter:自動生成get/set方法;

@ToString:生成toString方法,方便打印調試;

@EqualsAndHashCode:生成equalshashCode方法,注意這兩個應該同時去實現;

@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor:構造方法;

@Data:相當於 @ToString+ @EqualsAndHashCode+@Getter+ @Setter +@RequiredArgsConstructor

@Builder:生成builder方法;

@Log:日誌相關:

@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一樣可以高效開發。

IDEA沒有提供Builder,但可以通過安裝插件方式使用。

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

4 總結

一開始我是支持使用Lombok的,經過一段時間使用及出現了一些問題后,我還是覺得通過IDE自動生成代碼的方式更適合。畢竟強制要求別人安裝插件這種實在是太野蠻了,而通過IDEA生成代碼,別人不安裝插件也不會有報錯。

另外,多幾行代碼還能體現工作量,哈哈哈哈哈哈……

歡迎訪問南瓜慢說 www.pkslow.com獲取更多精彩文章!

歡迎關注微信公眾號<南瓜慢說>,將持續為你更新…

多讀書,多分享;多寫作,多整理。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

您可能也會喜歡…