Lombok @Builder.Default内部类未初始化问题咨询
Lombok嵌套Builder未自动初始化内部类属性问题解决
问题根源
你碰到的问题本质是:A类的@SuperBuilder不会自动为classB字段生成默认实例。B类的@Builder.Default仅对自身Builder生效——当你直接构建A时,A的Builder不会主动调用B的Builder创建实例,导致classB为null,其type自然取不到默认值。
两种可行解决方案
方案一:给A的classB字段添加@BuilderDefault并初始化默认实例
直接在A的classB字段上添加@Builder.Default,同时初始化一个B的默认实例,让A的Builder自动使用这个实例:
@SuperBuilder @Getter @Accessors(fluent = true) public static class A { private final long id; @Builder.Default private final B classB = B.builder().build(); } @SuperBuilder @Getter @Accessors(fluent = true) public static class B { @Builder.Default private final String type = "temporary"; }
此时调用A.builder().build(),classB会被自动初始化为带有默认type的B实例。
方案二:自定义A的Builder实现(适配复杂初始化逻辑)
如果需要更灵活的初始化规则,可以扩展A的Builder,在构建前自动补全classB:
@SuperBuilder @Getter @Accessors(fluent = true) public static class A { private final long id; private final B classB; public static class ABuilderImpl extends ABuilder<ABuilderImpl> { @Override public A build() { if (classB == null) { this.classB(B.builder().build()); } return super.build(); } } } @SuperBuilder @Getter @Accessors(fluent = true) public static class B { @Builder.Default private final String type = "temporary"; }
这种方式会在构建A时自动检查classB是否为空,为空则自动创建B的实例,确保属性正常初始化。
关键提醒
@Builder.Default仅作用于当前类的Builder,不会自动触发嵌套类的默认实例创建;- 即便使用普通
@Builder而非@SuperBuilder,上述方案的逻辑同样适用。
内容的提问来源于stack exchange,提问作者sansari
相关产品推荐
相关产品推荐

