构建器中某些字段的条件设置

问题描述 投票:0回答:2

我有一个带有构建器的旧版Java类-我不能更改此类。

[构建器的某些设置器在null输入上引发异常:

     public Cat.Builder setOwnerName(String value) {
        if (value == null) {
            throw new NullPointerException();
        } else {
            this.ownerName = value;
            this.onChanged();
            return this;
        }
     }

我正在尝试从另一个类创建该Cat-使用可能在相关字段中具有null值的外部对象:

  Cat cat = Cat.newBuilder()
            .setXYZ("XYZ")
            .setOwnerName(inputFromUser.getOwnerName())
            .build();

并且由于inputFromUser.getOwnerName()有时为null,所以构建器将引发异常。

我正在尝试找到一种优雅的方式来有条件地设置ownerName(或任何其他非空字段)。

java conditional-statements builder
2个回答
1
投票

您不必使用调用链来调用构建器:

Cat.Builder catBuilder = Cat.newBuilder();
catBuilder.setXYZ("XYZ");
catBuilder.setOwnerName(inputFromUser.getOwnerName());
Cat cat = catBuilder.build();

所以,这样写,并在需要的地方加上条件。

Cat.Builder catBuilder = Cat.newBuilder();
catBuilder.setXYZ("XYZ")
if (inputFromUser.getOwnerName() != null) {
  catBuilder.setOwnerName(inputFromUser.getOwnerName());
}
Cat cat = catBuilder.build();

1
投票
Cat.Builder builder = Cat.newBuilder()
    .setXYZ("XYZ");
Optional.ofNullable(inputFromUser.getOwnerName())
    .ifPresent(builder::setOwnerName);
// repeat above statement for all optional fields
Cat cat = builder.build();
© www.soinside.com 2019 - 2024. All rights reserved.