gpt4 book ai didi

java - 是否可以将 Lombok 的构建器公开?

转载 作者:行者123 更新时间:2023-12-01 21:25:56 25 4
gpt4 key购买 nike

我在项目中使用 Lombok 库,但无法在外部包中使用使用 @Builder 注释的类。

有没有办法让构建器公开?

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

错误是:

'MyClassBuilder()' is not public in 'com.foo.MyClass.MyClassBuilder'. Cannot be accessed from outside package

最佳答案

@Builder 已经生成了公共(public)方法,它只是包私有(private)的构造函数。原因是他们希望您使用公共(public)的静态 builder() 方法,而不是直接使用构造函数:

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

如果您真的、真的、真的希望构造函数是公共(public)的(似乎有一些建议表明其他基于反射的库可能需要它),那么 Lombok 永远不会覆盖您的任何内容我们已经显式声明了,因此您可以使用公共(public)构造函数声明这样的框架,Lombok 将填充其余部分,而无需将构造函数更改为包私有(private)或任何其他内容。

@Builder
public class Foo
{
private final String property;

public static class FooBuilder
{
public FooBuilder() { }

// Lombok will fill in the fields and methods
}
}

这种允许部分实现覆盖默认行为的一般策略也适用于大多数(也许是所有)其他 Lombok 注释。如果您的类使用 @ToString 进行注释,但您已经声明了 toString 方法,那么您的方法将不受影响。

为了向您展示生成的所有内容,我编写了以下类:

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

然后我通过 delombok 运行它查看生成的所有内容。如您所见,一切都是公开的:

public class Foo
{
private final String property;

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

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

public static class FooBuilder
{
private String property;

FooBuilder() { }

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

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

public String toString() {
return "Foo.FooBuilder(property=" + this.property + ")";
}
}
}

关于java - 是否可以将 Lombok 的构建器公开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48318097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com