[英]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.