使用Lombok Builder为BigDecimal类型字段统一设置默认值的替代方案咨询
Lombok Builder为BigDecimal类型字段统一设置默认值的替代方案咨询
嘿,我完全懂你的烦恼——当类里有10到15个BigDecimal字段,每个都要加@Builder.Default来保留BigDecimal.ZERO的默认值,确实显得代码臃肿又繁琐。这里有几个实用的替代方案,你可以根据项目情况选择:
方案一:自定义Builder初始化方法
直接在类中重写Lombok生成的builder()方法,在里面统一给所有BigDecimal字段设置默认值。用户调用builder()时,这些字段就自带默认值了,不用逐个加注解。
示例代码:
@Data @Builder @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = true) public class Audi extends Car { private String name; private String headquarter; private BigDecimal revenue; private BigDecimal totalAssets; // 自定义builder方法,统一设置BigDecimal默认值 public static AudiBuilder builder() { return new AudiBuilder() .revenue(BigDecimal.ZERO) .totalAssets(BigDecimal.ZERO); // 后续新增BigDecimal字段,直接在这里追加即可 } }
这种方式的好处是集中管理所有默认值,维护起来比分散的注解更清晰,而且完全依赖Lombok本身,不需要额外工具。
方案二:利用构造函数+Builder的toBuilder特性
如果你的类已经有@AllArgsConstructor,可以通过重载构造函数给BigDecimal字段设置默认值,再结合@Builder(toBuilder = true)让Builder继承构造函数的默认逻辑。
示例代码:
@Data @Builder(toBuilder = true) @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = true) public class Audi extends Car { private String name; private String headquarter; private BigDecimal revenue; private BigDecimal totalAssets; // 重载构造函数,给BigDecimal字段设默认值 public Audi(String name, String headquarter) { this.name = name; this.headquarter = headquarter; this.revenue = BigDecimal.ZERO; this.totalAssets = BigDecimal.ZERO; } }
不过这种方式更适合字段组合固定的场景,如果需要灵活的Builder配置,方案一可能更合适。
方案三:全局Lombok配置(进阶)
如果项目中有很多类都需要给BigDecimal字段设默认值,可以尝试通过lombok.config文件结合自定义注解实现全局配置:
- 自定义一个注解(比如
@BigDecimalDefaultZero) - 在
lombok.config中配置让Lombok识别这个注解并自动应用默认值
这个方法需要对Lombok自定义配置有一定了解,适合大型项目统一规范的场景。
综合来看,方案一应该是最直接、最易维护的选择,尤其适合你现在字段数量多但类型统一的情况。
备注:内容来源于stack exchange,提问作者Paul Marcelin Bejan
相关产品推荐
相关产品推荐

