构建器中某些字段的条件设置
Conditional setting of certain fields in a builder
我与建筑商有遗产 Java class - 我无法更改此 class。
构建器的某些设置器在 null
输入上抛出异常:
public Cat.Builder setOwnerName(String value) {
if (value == null) {
throw new NullPointerException();
} else {
this.ownerName = value;
this.onChanged();
return this;
}
}
我正在尝试从另一个 class 创建 Cat
- 使用可能在相关字段中具有或不具有 null
值的外部对象:
Cat cat = Cat.newBuilder()
.setXYZ("XYZ")
.setOwnerName(inputFromUser.getOwnerName())
.build();
并且由于 inputFromUser.getOwnerName()
有时是 null
,构建器会抛出异常。
我正在尝试找到一种优雅的方式来有条件地设置或不设置 ownerName
(或任何其他非空字段)。
您不必使用调用链来调用构建器:
Cat.Builder catBuilder = Cat.newBuilder();
catBuilder.setXYZ("XYZ");
catBuilder.setOwnerName(inputFromUser.getOwnerName());
Cat cat = catBuilder.build();
(你 可能 不需要。Builder 方法不需要 return 本身,但如果不这样做会有点不寻常) .
所以,就这样写吧,需要的地方加上条件。
Cat.Builder catBuilder = Cat.newBuilder();
catBuilder.setXYZ("XYZ")
if (inputFromUser.getOwnerName() != null) {
catBuilder.setOwnerName(inputFromUser.getOwnerName());
}
Cat cat = catBuilder.build();
如果你想变得更实用一点,你可以写一个这样的方法:
<T> void consumeIfNonNull(@Nullable T value, Consumer<? super T> consumer) {
if (value != null) consumer.accept(value);
}
然后做:
consumeIfNonNull(inputFromUser.getOwnerName(), catBuilder::setOwnerName);
我认为这在调用站点上比使用 Optional
更简洁,但对每个人来说都是如此。
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();
我与建筑商有遗产 Java class - 我无法更改此 class。
构建器的某些设置器在 null
输入上抛出异常:
public Cat.Builder setOwnerName(String value) {
if (value == null) {
throw new NullPointerException();
} else {
this.ownerName = value;
this.onChanged();
return this;
}
}
我正在尝试从另一个 class 创建 Cat
- 使用可能在相关字段中具有或不具有 null
值的外部对象:
Cat cat = Cat.newBuilder()
.setXYZ("XYZ")
.setOwnerName(inputFromUser.getOwnerName())
.build();
并且由于 inputFromUser.getOwnerName()
有时是 null
,构建器会抛出异常。
我正在尝试找到一种优雅的方式来有条件地设置或不设置 ownerName
(或任何其他非空字段)。
您不必使用调用链来调用构建器:
Cat.Builder catBuilder = Cat.newBuilder();
catBuilder.setXYZ("XYZ");
catBuilder.setOwnerName(inputFromUser.getOwnerName());
Cat cat = catBuilder.build();
(你 可能 不需要。Builder 方法不需要 return 本身,但如果不这样做会有点不寻常) .
所以,就这样写吧,需要的地方加上条件。
Cat.Builder catBuilder = Cat.newBuilder();
catBuilder.setXYZ("XYZ")
if (inputFromUser.getOwnerName() != null) {
catBuilder.setOwnerName(inputFromUser.getOwnerName());
}
Cat cat = catBuilder.build();
如果你想变得更实用一点,你可以写一个这样的方法:
<T> void consumeIfNonNull(@Nullable T value, Consumer<? super T> consumer) {
if (value != null) consumer.accept(value);
}
然后做:
consumeIfNonNull(inputFromUser.getOwnerName(), catBuilder::setOwnerName);
我认为这在调用站点上比使用 Optional
更简洁,但对每个人来说都是如此。
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();