背景
使用@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之后返回的是全空的属性的对象,默认值设置也就失效了;