Итак, в знаменитой книге Effective Java она представляет шаблон Builder, где вы можете создать внутренний статический класс Builder для создания экземпляра класса. Книга предлагает следующий дизайн класса:Является ли вложенный класс Builder действительно необходимым, как описано в «Эффективной Java»?
public class Example {
private int a;
private int b;
public static class Builder() {
private int a;
private int b;
public Builder a(int a) {
this.a = a;
return this;
}
public Builder b(int b) {
this.b = b;
return this;
}
public Example build() {
return new Example(this);
}
}
private Example(Builder builder) {
this.a = builder.a;
this.b = builder.b;
}
}
Однако я не в состоянии понять, почему мы действительно нуждаемся внутренний Builder class
? Вышеприведенный код имеет повторяющиеся строки для деклараций полей (int a, b), это стало бы довольно беспорядочным, если бы у нас было больше полей.
Почему бы не просто избавиться от класса Builder
и позволить классу Example
взять на себя все set
методы, которые были в классе Builder
?
Так инстанцирует Example
, он стал бы Example e = new Example().a(3).b.(3);
вместо Example e = new Example.Builder.a(3).b(3).build();
ПРИМЕЧАНИЕ: Книга предлагает этот шаблон для классов, которые имеют длинный список параметров, которые необходимо установить.
Это наиболее полезно для изготовления неизменяемых объектов. – shmosel
В некоторых случаях сложной инициализации ваши значения уже должны быть установлены. Кроме того, использование методов 'a()' и 'b()' изменяет объект 'Example'. – EpicPandaForce
Builder не нужен для этого случая и фактически делает код намного более подробным. –