如何精简子类构造器?基于Lombok优化多子类冗余构造代码
解决方案
一、Lombok注解解决(修复@SuperBuilder不生效问题)
你之前用@SuperBuilder没生效,大概率是没按规则配置,正确用法如下:
- 父类配置:给抽象父类加上
@SuperBuilder注解,父类成员变量设为protected(或配合@Getter/@Setter,@SuperBuilder会自动处理访问逻辑)。示例:
@SuperBuilder public abstract class ParentClass { protected A a; protected B b; // ... 剩余8个父类变量 }
- 子类配置:子类直接加
@SuperBuilder,无需手动编写构造器;若需支持对象复制,可追加toBuilder = true。示例:
@SuperBuilder(toBuilder = true) public class ChildClassName extends ParentClass { // 子类自有变量(如有) }
创建子类对象时,通过链式调用设置所有属性,彻底告别冗长构造器:
ChildClassName child = ChildClassName.builder() .a(new A()) .b(new B()) // ... 其他父类属性 // 子类属性(如有) .build();
注意:确保Lombok版本在1.18.16及以上,旧版本对抽象类的@SuperBuilder支持存在缺陷。
二、设计模式优化
若不想依赖Lombok,或需要更灵活的控制,可采用以下设计模式:
1. 参数对象模式(Parameter Object)
将父类的10个变量封装到单独的参数类(如ParentConfig)中,子类构造器仅接收该参数对象,大幅简化代码:
// 封装父类参数的类 public class ParentConfig { private A a; private B b; // ... 其他8个变量 // 可通过Lombok的@AllArgsConstructor简化构造逻辑 } // 父类构造器改为接收ParentConfig public abstract class ParentClass { public ParentClass(ParentConfig config) { this.a = config.getA(); this.b = config.getB(); // ... 为其他变量赋值 } } // 子类构造器 public class ChildClassName extends ParentClass { public ChildClassName(ParentConfig config) { super(config); } }
后续父类变量增减时,仅需修改ParentConfig,无需改动所有子类构造器。
2. 手动实现建造者模式
若需自定义对象创建逻辑,可手动实现建造者:
- 父类定义抽象建造者接口,包含所有父类属性的设置方法;
- 子类实现自身建造者,继承父类建造方法并添加子类特有属性设置;
- 通过建造者的
build()方法生成对象。
这种方式和Lombok的@SuperBuilder原理一致,但能灵活扩展自定义逻辑。
3. 抽象工厂模式
若多个子类的创建逻辑存在共性,可通过抽象工厂统一管理对象创建:
public abstract class AbstractChildFactory { // 封装父类参数的初始化逻辑 protected ParentConfig createParentConfig(A a, B b, ...) { return new ParentConfig(a, b, ...); } // 抽象方法,子类实现具体创建逻辑 public abstract ChildClassName createChild(A a, B b, ...); } public class ChildFactory extends AbstractChildFactory { @Override public ChildClassName createChild(A a, B b, ...) { ParentConfig config = createParentConfig(a, b, ...); return new ChildClassName(config); } }
创建子类对象时直接调用工厂方法,无需关注构造器细节,还能统一修改初始化逻辑。
内容的提问来源于stack exchange,提问作者Ksushant881
相关产品推荐
相关产品推荐

