SpringBoot 開發實踐(8):使用 Lombok 淨化重複代碼

前言

在日常開發中,我們時常需要編寫一些重複的、非業務相關的功能性代碼。比如實體類私有屬性的 get / set 方法、創建日誌輸出類等。

這也是 Java 飽受詬病的地方之一。往往這些冗餘的代碼雖然跟業務無關,但由於其功能性又不得不寫,十分浪費時間,影響美觀不說,後期如果有改動還不方便維護。

爲了解決上述痛點,就不得不提到神器 Lombok 了。有了 Lombok,在開發中我們就可以使用簡單的註解,來避免編寫那些重複的功能性代碼。在編譯的時候,Lombok 會根據註解自動幫我們生成我們省去的那些代碼。是不是很神奇?那麼接下來我就來介紹下 Lombok 的常見使用方法。

環境配置

添加 Maven 依賴

pom.xml 添加 Maven 依賴。

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.16.22</version>
</dependency>

在 IDEA 中添加 Lombok 插件

打開 IntelliJ IDEA -> Preferences -> Plugins,搜索“Lombok”並安裝。
在這裏插入圖片描述

如果不安裝該插件,是不影響程序的正常運行。但是在開發中會出現紅波浪線浪報警,看着令人惱火。安裝這個插件,是爲了讓編譯器支持解析 Lombok 註解,在使用時不報錯。

Lombok 的使用

@Getter & @Setter

@Getter & @Setter 註解可以用於自動生成實體類中私有屬性的 getset 方法。

Lombok 寫法

@Getter
@Setter
public class Person {
    private int id;
    private String name;
    private int age;
}

@Getter & @Setter 註解打在類上,那麼該類中的所有方法都將生成 getset 方法。如果想要對個別屬性單獨配置,也可以將 @Getter & @Setter 註解打在需要的屬性上。

等價的 Java 代碼

public class Person {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

@ToString

用於重寫 toString() 方法,將類中的屬性一次輸出。

Lombok 寫法

@ToString(callSuper = true)
public class Person {
    private int id;
    private String name;
    private int age;
}

等價的 Java 代碼

public class Person {
    private int id;
    private String name;
    private int age;

    public String toString() {
        return "Foo(super=" + super.toString() + 
        ", id=" + this.id + 
        ", name=" + this.name + 
        ", age=" + this.age + ")";
    }
}

@ToString() 中常用屬性:

  • callSuper: 默認爲 false。true 時會把 super 中的 toString() 方法一併輸出。
  • onlyExplicitlyIncluded:是否只輸出指定屬性。默認爲 false。
  • include:可以指定要輸出哪些屬性。要配合 onlyExplicitlyIncluded 屬性使用。
  • exclude:可以指定不輸出哪些屬性。

@EqualsAndHashCode

用於重寫 equals()hashCode() 方法。

Lombok 寫法

@EqualsAndHashCode
public class Person {
    private int id;
    private String name;
    private int age;
}

等價的 Java 代碼

public class Person {
    private int id;
    private String name;
    private int age;

    public boolean equals(final Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof Person2)) {
            return false;
        } else {
            Person2 other = (Person2)o;
            if (!other.canEqual(this)) {
                return false;
            } else if (this.id != other.id) {
                return false;
            } else {
                Object this$name = this.name;
                Object other$name = other.name;
                if (this$name == null) {
                    if (other$name == null) {
                        return this.age == other.age;
                    }
                } else if (this$name.equals(other$name)) {
                    return this.age == other.age;
                }

                return false;
            }
        }
    }

    protected boolean canEqual(final Object other) {
        return other instanceof Person2;
    }

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        int result = result * 59 + this.id;
        Object $name = this.name;
        result = result * 59 + ($name == null ? 43 : $name.hashCode());
        result = result * 59 + this.age;
        return result;
    }
}

@Data

一般,我使用 @Data 註解最多。@Data 註解是將 @ToString@EqualsAndHashCode@Getter@Setter 集合與一身。

Lombok 寫法

@Data
public class Person {
    private int id;
    private String name;
    private int age;
}

等價的 Java 因爲篇幅過長我就不貼了,因爲是集合上述的四個註解,所以等價代碼等於上述等價代碼的合併。

@Log

@Log 類註解用於創建日誌輸出類。支持如下幾種模式,分別對應不同的日誌框架。

  • @CommonsLog
  • @Flogger
  • @JBossLog
  • @Log
  • @Log4j
  • @Log4j2
  • @Slf4j
  • @XSlf4j
  • @CustomLog

我常用的類型是 @Slf4j

Lombok 寫法

@Slf4j
@Service
public class MyServiceImpl implements MyService {
    @Override
    public void test() {
        log.info("使用 @Slf4j 輸出日誌");
    }
}

等價的 Java 代碼

@Service
public class MyServiceImpl implements MyService {
    private static final Logger log = LoggerFactory.getLogger(MyServiceImpl.class);

    public MyServiceImpl() {
    }

    public void test() {
        log.info("使用 Logger 輸出日誌");
    }
}

以上就是開發中常用的 Lombok 註解,確實能在很大程度上幫助我們簡化代碼,讓開發人員把更多精力集中在業務代碼的編寫。尤其是在對 POJO 的操作上,碰上屬性特別多的類,只需要標註一個 @Data 註解,就能少些很多代碼。

本文僅介紹一些常用的 Lombok 註解。想要了解更多 Lombok 內容,可以參考其它資料。

本章代碼地址:GitHub


推薦文章:


我是因特馬,一個愛分享的斜槓程序員~

歡迎關注我的公衆號:一隻因特馬


原文作者: 一隻因特馬
原文鏈接: https://www.interhorse.cn/a/68291188/
版權聲明: 本博客所有文章除特別聲明外,均採用 BY-NC-ND 許可協議。轉載請註明出處!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章