【开发踩坑】@Builder注解下字段默认值设置失败

背景

使用@Builder注解并对一个属性设置了默认值

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class GeneralManagerDetailsVo {
    @ApiModelProperty("当~")
    private Integer ifEvaluate=1;
}

然后用builder().build()初始化并使用对象:

GeneralManagerDetailsVo generalManagerDetailsVo = 
GeneralManagerDetailsVo.builder().build();

这里的ifEvaluate属性默认值设置失败,属性取出为空;

解决

点进去看@Builder:

@Target({TYPE, METHOD, CONSTRUCTOR})
@Retention(SOURCE)
public @interface Builder {
   /**
    * The field annotated with {@code @Default} must have an initializing expression; 
    * that expression is taken as the default to be used if not explicitly set during building.
    */
   @Target(FIELD)
   @Retention(SOURCE)
   public @interface Default {}
   
}

最新版本明确说明了:
加入 @Default 注解的属性如果在build阶段没有明确set值,那么就会取默认值;
所以这里增加一个@Builder.Default注解就解决了:

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("总经理排名详情信息 出参")
public class GeneralManagerDetailsVo {

    @Builder.Default
    @ApiModelProperty("当未评定是显示0")
    private Integer ifEvaluate=1;

}

延伸

顺手去看看内部细节:
在这里插入图片描述

本质是AOP注入一个内部类:TBuilder
这个TBuilder包含了原始类的每一个属性的一个操作方法:
所谓的:

GeneralManagerDetailsVo.builder().ifEvaluate().build();

运行时设置属性的值(如果没有传入,则不会设置);
那么如果走的是Builder().build(),这里会直接pass属性设置,build之后返回的是全空的属性的对象,默认值设置也就失效了;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值