Допустимо ли повторно использовать экземпляр построителя при создании нескольких объектов с одинаковыми значениями? - PullRequest
4 голосов
/ 30 января 2020

Рассмотрим следующий POJO с составным ключом, keyA и keyB, некоторыми значениями и аннотацией сборщика lombok.

@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() создается новый объект.

Теперь эти строки не слишком различаются по сложности, но по мере создания более крупных объектов, когда постоянные значения согласованы по многим из них, управлять кодом становится значительно сложнее, поскольку приходится обновлять каждый оператор компоновщика. если для каждого из них требуется базовое изменение.

Предполагается, что вы передаете только ссылки и обновляете значения, является ли это подходящим использованием парадигмы построителя, или в концепции парадигмы построителя строго один строитель дает один объект?

1 Ответ

4 голосов
/ 30 января 2020

Всегда целесообразно использовать один и тот же конструктор для создания нескольких объектов. В конце концов, это основная цель строителя c - строить объекты.

То, как вы использовали конструктор, вполне приемлемо.

...