繁体   English   中英

使用 Lombok Builder 的 BigDecimal 默认值

[英]Default Value for BigDecimal using Lombok Builder

让我们考虑以下实体:

@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的Entity,每个字段都有这个注解就不太美观了。

还有其他选择吗?

正如迈克尔指出的那样,您没有太多其他选择。 如果您添加了@Builder注释,则必须对每个字段使用@Builder.Default才能使用流畅的构建器 API。

@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);

Output:

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);

Output:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM