是否有可能将Lombok的建造者公之于众?

时间:2018-01-18 09:42:38

标签: java lombok

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

有没有办法让建筑商公开?

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

错误是:

  

'MyClassBuilder()'不公开   'com.foo.MyClass.MyClassBuilder'。无法访问   来自外包

5 个答案:

答案 0 :(得分:11)

SyntaxError: invalid syntax 已经生成公共方法。您应该使用静态@Builder方法,而不是尝试自己实例化构建器:

builder()

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

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

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

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

答案 1 :(得分:1)

此构建器注释的问题在于,如果您看到delombok,则生成的构建器构造函数没有访问指示符(公共,私有,受保护),因此仅在同一包中可见。 如果扩展类位于同一包中,则可以使用该功能。

我遇到了同样的问题,我认为lombok目前不支持此问题。 我可以在此处https://github.com/rzwitserloot/lombok/issues/1489

中找到功能请求

我的建议是在此类中强制实施构建器模式。

答案 2 :(得分:0)

我发现了这种整洁的解决方法:

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();}
}

答案 3 :(得分:0)

问题是您使用错误的方式使用@Builder。

使用Builder Pattern时,只需使用静态方法来调用它,然后进行构建,例如:

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

请不要再次new MyClassBuilder,因为您直接使用内部MyClassBuilder类,它会破坏模式的封装。该构造函数被隐藏在外部,这就是为什么您会收到不可访问的错误的原因。相反,它为您提供了静态方法builder()

答案 4 :(得分:0)

如上所述,您可以使用构建器,现在不是用户属性,builder()将返回实例创建,因此您可以将其视为普通构建器(无需使用属性)

instance = MyClass.MyClassBuilder().property1(value1).property1(value2).build();