Java中lombok @Builder註解使用詳解

簡介

Lombok你們都知道,在使用POJO過程當中,它給咱們帶來了不少便利,省下大量寫get、set方法、構造器、equal、toString方法的時間。除此以外,經過@Builder註解,lombok還能夠方便的時間建造者模式。bash

只須要定義一個靜態公共的內部類便可。代碼示例以下:函數

public class User {
    private Integer id;
    private String name;
    private String address;

    private User() {
    }

    private User(User origin) {
        this.id = origin.id;
        this.name = origin.name;
        this.address = origin.address;
    }

    public static class Builder {
        private User target;

        public Builder() {
            this.target = new User();
        }

        public Builder id(Integer id) {
            target.id = id;
            return this;
        }

        public Builder name(String name) {
            target.name = name;
            return this;
        }

        public Builder address(String address) {
            target.address = address;
            return this;
        }

        public User build() {
            return new User(target);
        }
    }
複製代碼

若是項目中有使用lombok的話,能夠直接使用@Builder註解來實現ui

改造上面的類以下:this

import lombok.Builder;
import lombok.ToString;

/**
 * @author wulongtao
 */
@ToString
@Builder
public class UserExample {
    private Integer id;
    private String name;
    private String address;
}
複製代碼

如何使用:spa

UserExample userExample = UserExample.builder()
                .id(1)
                .name("aaa")
                .address("bbb")
                .build();

System.out.println(userExample);
複製代碼

遇到問題

在使用@Builder過程當中,發現了一問題:子類的Builder對象沒有父類的屬性。這在使用上形成了必定的問題。

對於這個問題,找到了以下解法3d

  1. 對於父類,使用@AllArgsConstructor註解
  2. 對於子類,手動編寫全參數構造器,內部調用父類全參數構造器,在子類全參數構造器上使用@Builder註解

經過這種方式,子類Builder對象可使用父類的全部私有屬性。
可是這種解法也有兩個反作用:code

  • 由於使用@AllArgsConstructor註解,父類構造函數字段的順序由聲明字段的順序決定,若是子類構造函數傳參的時候順序不一致,字段類型還同樣的話,出了錯很差發現
  • 若是父類字段有增減,全部子類的構造器都要修改

雖然有這兩個反作用,可是這種解法是我找到的惟一一種解決子類使用@Builder,能使用父類屬性的方式。cdn

參考博客評論: Lombok’s @Builder annotation and inheritance對象

如何在使用@Builder的模式中,加入字段的默認值。由於使用了建造者模式,那麼通常在類內聲明字段的時候給字段默認值的方式就是無效的,須要在建造者上動手腳。

  1. 自定義靜態內部類做爲建造者,賦予默認值,再使用@Builder註解,這個時候lombok會補全已有的建造者類,進而使用默認值
  2. 更新的lombok有@Builder.Default聲明,註解在須要默認值的字段上便可。

在評論區也有這種方式的反作用討論,連接是: Using Lombok’s @Builder annotation with default valuesblog

相關文章
相關標籤/搜索