提问者:小点点

使用Lombok Builder的BigDecimal的默认值


让我们考虑以下实体:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Audi extends Car {

    private String name;
    
    private String headquarter;
    
    private BigDecimal revenue = BigDecimal.ZERO;

    private BigDecimal totalAssets = BigDecimal.ZERO;

}

我希望所有的BigDecimal变量都BigDecimal.ZERO作为默认值。如果我在声明后立即初始化它,

我得到了这个警告:

@Builder将完全忽略初始化表达式。如果您希望初始化表达式作为默认值,请添加@Builder. Default。如果它不应该在构建期间设置,请将字段设为最终字段。

对于具有10/15 BigDecimal的实体,在每个字段上都有此注释并不漂亮。

有其他选择吗?


共1个答案

匿名用户

正如Michael所指出的,您没有很多其他选择。如果您添加了@Builder注释,则必须对每个字段使用@Builder. Default才能使用流畅的builderAPI。

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Audi extends Car {

    private String name;
    private String headquarter;
    @Builder.Default
    private BigDecimal revenue = BigDecimal.ZERO;
    @Builder.Default
    private BigDecimal totalAssets = BigDecimal.ZERO;
}

用法:

Audi audi = Audi.builder()
    .name("Audi A3")
    .headquarter("Germany")
    .build();
System.out.println(audi);

输出:

Audi(name=Audi A3, headquarter=Germany, revenue=0, totalAssets=0)

如果不需要构建器功能,可以使用构造函数以传统的Java方式实例化对象。但是,在这种情况下,应该删除@Builder注释,并且必须直接在构造函数中或在声明期间设置默认值。

@Data
@NoArgsConstructor
@RequiredArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Audi extends Car {
    @NonNull
    private String name;
    @NonNull
    private String headquarter;
    private BigDecimal revenue = BigDecimal.ZERO;
    private BigDecimal totalAssets = BigDecimal.ZERO;
}

用法:

final Audi audi = new Audi("Audi A3", "Germany");
System.out.println(audi);

输出:

Audi(name=Audi A3, headquarter=Germany, revenue=0, totalAssets=0)