簡體   English   中英

是否有可能將Lombok的建造者公之於眾?

[英]Is it possible to make Lombok's builder public?

我在我的項目中使用Lombok庫,我無法在外部包中使用帶@Builder注釋的類。

有沒有辦法讓建築師公開?

MyClass instance = new MyClass.MyClassBuilder().build();

錯誤是:

'myClassBuilder()'在'com.foo.MyClass.MyClassBuilder'中不公開。 無法從外部包訪問

@Builder 已經生成了公共方法。 您應該使用static builder()方法而不是嘗試自己實例化構建器:

Buildable foo = Buildable.builder()
    .property("hello, world")
    .build();

為了向您展示生成的所有內容,我編寫了以下類:

@Builder
public class Buildable
{
    private final String property;
}

然后我通過delombok運行它來查看生成的所有內容。 如你所見,一切都是公開的:

public class Buildable
{
    private final String property;

    @java.beans.ConstructorProperties({"property"})
    Buildable(final String property) {
        this.property = property;
    }

    public static BuildableBuilder builder() {
        return new BuildableBuilder();
    }

    public static class BuildableBuilder
    {
        private String property;

        BuildableBuilder() { }

        public BuildableBuilder property(final String property) {
            this.property = property;
            return this;
        }

        public Buildable build() {
            return new Buildable(property);
        }

        public String toString() {
            return "Buildable.BuildableBuilder(property=" + this.property + ")";
        }
    }
}

問題是你以錯誤的方式使用@Builder。

使用Builder Pattern ,您只需要使用靜態方法來調用它然后構建,例如:

MyClass instance = MyClass.builder().build();

請不要new MyClassBuilder ,它會破壞模式的封裝,因為您直接使用內部MyClassBuilder類。 這個構造函數是從外面隱藏的,這就是為什么你得到了無法訪問的錯誤。 相反,它為您提供靜態方法builder()

這個構建器注釋的問題在於,如果你看到delombok,生成器的生成構造函數沒有訪問指示符(public,private,protected),因此只能在同一個包中看到。 如果擴展類在同一個包中,這將起作用。

我遇到了同樣的問題,我認為lombok暫時不支持這個問題。 我可以在這里找到功能請求https://github.com/rzwitserloot/lombok/issues/1489

我的建議是在這個類中硬實現構建器模式。

我找到了這個整潔的解決方法:

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Builder
public class Customer {
    private String id;
    private String name;

    public static MessageBuilder builder() {return new CustomerBuilder();}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM