iT邦幫忙

2021 iThome 鐵人賽

DAY 10
0
Software Development

一個新鮮人如何完轉Spring boot與DevOps從0到101系列 第 10

Lombok 利器去除冗餘

一般來說我們建立一個實體像是以下

@Entity
public class Product {
    private Long id;
    private Integer price;
    private String name;
    public Product() {
    }
    public Product(String name, int price) {
        this.name = name;
        this.price = price;
    }
    ...
}

建立好之後,我們要讓它被存取,因此都會使用 get、set 方式進行設定,當然還有建構方法甚至是 toString 這些很常的被使用,因此程式碼有很多時間都在做這些事,不僅是代碼過於冗長甚至浪費一些精力在這個地方。透過 Lombok 工具可以省下一些精力。

maven 引用 Lombok 方式

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

透過 @Getter @Setter @NoArgsConstructor 這些 Lombok 注釋讓我們輕鬆許多

@Entity
@Getter // 所有屬性都設置 get
@Setter // 所有屬性都設置 set
@NoArgsConstructor  // 無參構造函式
@AllArgsConstructor // 全參構造函式
@ToString // 建構 toString
public class Product {
    // 有了 Lombok 注釋,程式碼更簡潔
    private Long id;
    private Integer price;
    private String name;
}

假設我們從 client 請求獲取數據,但其數據需要經過一些處裡才能被儲存至 DB 中,在被儲存在 DB 中我們的實體會被建構。但這件構過程中需要 new 出物件,並使用 set 方式將這個實體組成一個能被 DB 儲存的物件。就像以下

Product product = new Product();
product.setPrice(100);
product.setName("Apple");

但藉由 Lombok 中 @Builder 注釋我們可以更簡潔更容易閱讀

Product product = Product.builder()
.price(100)
.name("Apple")
.build();

假設有一個實體屬性是 List 類型,我們可以透過 @Singular 注釋進行建構,如下

@Entity
@Getter // 所有屬性都設置 get
@Setter // 所有屬性都設置 set
@NoArgsConstructor  // 無參構造函式
@AllArgsConstructor // 全參構造函式
public class Product {
    // 有了 Lombok 注釋,程式碼更簡潔
    private Long id;
    private Integer price;
    private String name;
    @Singular("tag")
    private List<String> tags;
}

我們建構數據的時候可以有以下效果

Product product = Product.builder()
.price(100)
.name("Apple")
.tag("eat") // this
.tag("health") // this
.build();

Lombok 還有滿多有趣的用法像是以下

public class Test {
    ...
    @EqualsAndHashCode(onlyExplicitlyIncluded = true) // 覆寫 quals 和 HashCode
    public static class GroupBy { 
        @EqualsAndHashCode.Include
        private String brand;
        @EqualsAndHashCode.Include
        private String model;
        @EqualsAndHashCode.Include
        private int year;
    }
}

反正學不完...,繼續加油吧!!


上一篇
談談 Spring boot Controller API 怎麼設計
下一篇
少不了 Nginx 反向代理和 SSL
系列文
一個新鮮人如何完轉Spring boot與DevOps從0到10130

尚未有邦友留言

立即登入留言