You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何精简子类构造器?基于Lombok优化多子类冗余构造代码

解决方案

一、Lombok注解解决(修复@SuperBuilder不生效问题)

你之前用@SuperBuilder没生效,大概率是没按规则配置,正确用法如下:

  1. 父类配置:给抽象父类加上@SuperBuilder注解,父类成员变量设为protected(或配合@Getter/@Setter,@SuperBuilder会自动处理访问逻辑)。示例:
@SuperBuilder
public abstract class ParentClass {
    protected A a;
    protected B b;
    // ... 剩余8个父类变量
}
  1. 子类配置:子类直接加@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 01:00:10