如何将构建器模式与 vargs 一起使用?
How to use a builder pattern with vargs?
假设我有 varargs 方法,我正在尝试构建使用构建器模式的 Foo
public Foo buildSomething(String... attributes) {
return Foo.builder()
.attribute(attributes[0])
.attribute(attributes[1])
.attribute(attributes[2])
...
.build()
}
显然,这是行不通的。可以用流来完成吗?
FooBuilder builder = Foo.builder();
for (String attribute : attributes) {
builder = builder.attribute(attribute);
}
return builder.build();
通常不需要在 for 循环中调用 builder =
,但这样您就不会对构建器是否返回相同实例做出任何假设。
您可以使用流来执行此操作,但鉴于要求,我认为这是不必要的:
FooBuilder builder = Foo.builder();
Arrays.stream(attributes)
.forEach(builder::attribute);
return builder.build();
如果您需要使用其他一些 intermediate/filter 方法,我只会推荐使用流。否则您可能正在创建不必要的分配。您也无法 update/reassign 构建器变量,除非您使用 AtomicReference
或单元素数组:
FooBuilder[] builder = {Foo.builder()};
Arrays.stream(attributes)
.forEach(a -> {
builder[0] = builder[0].attribute(a);
});
return builder.build();
恶心。
假设我有 varargs 方法,我正在尝试构建使用构建器模式的 Foo
public Foo buildSomething(String... attributes) {
return Foo.builder()
.attribute(attributes[0])
.attribute(attributes[1])
.attribute(attributes[2])
...
.build()
}
显然,这是行不通的。可以用流来完成吗?
FooBuilder builder = Foo.builder();
for (String attribute : attributes) {
builder = builder.attribute(attribute);
}
return builder.build();
通常不需要在 for 循环中调用 builder =
,但这样您就不会对构建器是否返回相同实例做出任何假设。
您可以使用流来执行此操作,但鉴于要求,我认为这是不必要的:
FooBuilder builder = Foo.builder();
Arrays.stream(attributes)
.forEach(builder::attribute);
return builder.build();
如果您需要使用其他一些 intermediate/filter 方法,我只会推荐使用流。否则您可能正在创建不必要的分配。您也无法 update/reassign 构建器变量,除非您使用 AtomicReference
或单元素数组:
FooBuilder[] builder = {Foo.builder()};
Arrays.stream(attributes)
.forEach(a -> {
builder[0] = builder[0].attribute(a);
});
return builder.build();
恶心。