让我们考虑以下实体:
@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的实体,在每个字段上都有此注释并不漂亮。
有其他选择吗?
正如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)