考虑以下POJO,其中包含复合键,键A和键B,一些值和龙目岛生成器注释。
@Builder
class Foo {
int keyA;
int keyB;
String author;
String value;
... other stuff
}
使用传统的构建器范例,您只需将所有构建器元素链接在一起。
List<Foo> list = new ArrayList<>();
list.add(Foo.builder().keyA(1234).keyB(1).author("Bob Jones").value(...).build());
list.add(Foo.builder().keyA(1234).keyB(3).author("Bob Jones").value(...).build());
list.add(Foo.builder().keyA(1234).keyB(4).author("Bob Jones").value(...).build());
list.add(Foo.builder().keyA(1234).keyB(5).author("Bob Jones").value(...).build());
list.add(Foo.builder().keyA(1234).keyB(7).author("Bob Jones").value(...).build());
相反,我可以将构建器另存为变量并重用它,仅覆盖某些值。
List<Foo> list = new ArrayList<>();
Foo.FooBuilder builder = Foo.builder().keyA(1234).author("Bob Jones");
list.add(builder.keyB(1).value(...).build());
list.add(builder.keyB(3).value(...).build());
list.add(builder.keyB(4).value(...).build());
list.add(builder.keyB(5).value(...).build());
list.add(builder.keyB(7).value(...).build());
生成器值在每个构建调用之间被覆盖,并在build()
上创建新对象。
现在,这些行在复杂性上并没有太大的不同,但是随着创建更大的对象,并且其中许多代码的固定值是一致的,代码变得非常难以管理,因为如果每个行都需要基本更改,则必须更新每个生成器语句。
假设您只传递引用和更新值,这是构建器范式的适当用法,还是构建器范式的概念严格来说是一个构建器产生一个对象?
使用相同的构建器创建多个对象总是合适的。毕竟,这是构建器的基本目的,构建对象。
您使用构建器的方式是完全可以接受的。