使用Lombok Builder时覆盖默认值

4
我正在使用Lombok的构建器。要为某些变量分配默认值,我尝试使用@Builder.Default注释。但问题是,使用上述注释后,我无法通过构建器初始化该值,因为编译器说在通过构建器初始化变量时不能解析该方法。因此,我要寻求的基本上是一种设置默认值并仍然能够在通过构建器启动时进行覆盖的方法。
1个回答

4

我的团队一直在努力解决在某些IDE中注释无法正常工作的问题。我们的解决方法是使用带有@Builder注释的构造函数,如果没有给定值,则设置默认值。例如:

public class ExampleClass {

    private final OtherClass otherClassField;

    @Builder
    public ExampleClass(OtherClass otherClass) {
        // if otherClass is null, use a default value
        otherClassField = otherClass != null ? otherClass : new OtherClass();
    }
}

作为一条注意事项,如果您的类有原始类型字段,则需要使用原始包装类型作为构造函数参数,以便能够继续使用 null 值来指示回退到默认设置。
您还可以将构造函数访问级别更改为 private,以允许仅使用构建器创建此类的实例。

谢谢Thomas。所以当你说IDE时,你是指编译对你来说工作正常,但错误只是在IDE中吗?因为对我来说,即使我将字段标记为@Builder.Default并尝试使用构建器初始化它,编译也会失败。 - Andy897
是的,对我来说从命令行编译工作得很好。在IDE(我们使用的是Intellij)中编译/运行单元测试就是出了问题。 - Thomas
所以即使您已将值标记为Builder.default,您仍然可以通过构建器初始化该值?奇怪:( - Andy897
有几件事情需要注意,构造函数的访问级别可以设置为package,以防止直接使用构造函数。其次,这与@Value注解很好地配合使用,可以使对象不可变。在上面的例子中,添加@Value注解后,您可以删除字段上的final标记,并生成getter方法。 - James Render

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接