如何在Lombok自定义Builder中直接返回目标类以避免双重build?
解决方案:避免双重build,让Builder直接返回SampleClass
当然可以解决这个问题!你现在需要两次build()的根本原因是:你给SampleClassBuilder加了Lombok的@Builder注解,这会让Lombok自动生成一套独立的builder机制——调用SampleClassBuilder.builder()返回的是Lombok生成的内部Builder实例,第一次build()会生成SampleClassBuilder对象,然后你才调用自己写的build()方法转成SampleClass,所以才需要两次调用。
下面给你两种简洁的解决方法:
方法一:移除Lombok@Builder,手动实现链式Builder
完全自己控制Builder的逻辑,不需要依赖Lombok的自动生成,直接让build()返回SampleClass:
public class SampleClassBuilder { private String x; private String y; // 私有构造,强制通过builder()入口创建实例 private SampleClassBuilder() {} // Builder入口方法 public static SampleClassBuilder builder() { return new SampleClassBuilder(); } // 链式设置x,返回自身实现链式调用 public SampleClassBuilder x(String x) { this.x = x; return this; } // 链式设置y public SampleClassBuilder y(String y) { this.y = y; return this; } // 直接返回SampleClass实例的build方法 public SampleClass build() { SampleClass sampleClass = new SampleClass(); sampleClass.setA(x + "testX"); sampleClass.setB(y + "textY"); return sampleClass; } }
调用代码(只需一次build)
SampleClass sampleClass = SampleClassBuilder.builder().x("x -- ").y("y---").build();
方法二:利用Lombok@Builder注解静态工厂方法
如果还是想借助Lombok减少手动代码,可以把@Builder注解加在静态工厂方法上,让Lombok直接生成返回SampleClass的builder:
public class SampleClassBuilder { // 用@Builder注解静态方法,指定builder方法名为builder @Builder(builderMethodName = "builder") public static SampleClass buildSampleClass(String x, String y) { SampleClass sampleClass = new SampleClass(); sampleClass.setA(x + "testX"); sampleClass.setB(y + "textY"); return sampleClass; } }
调用代码(同样只需一次build)
SampleClass sampleClass = SampleClassBuilder.builder().x("x -- ").y("y---").build();
两种方案对比
- 方法一:完全自定义,灵活度高,适合需要复杂builder逻辑的场景
- 方法二:借助Lombok减少重复代码,适合逻辑简单的场景
核心思路就是避免Lombok生成的builder和你自己的build方法产生嵌套结构,让builder的最终build()方法直接返回目标SampleClass实例即可。
内容的提问来源于stack exchange,提问作者user1692342
相关产品推荐
相关产品推荐

