приватные поля в классе Пицца и
Строитель дублируется. Это будет
раздражает, когда число частных
поля становятся больше. Есть ли
способ избежать этого?
Лично я могу обойти это, используя третий класс объектов со статическими значениями, который содержит все поля, и использую его как в конструкторе, так и в основном классе (доступ к полям обрабатывается делегированием). Конечно, это может привести к увеличению числа строк / классов, но это неоценимо в случае, если ваши сборщики столкнутся с большим количеством полей и проверок.
Кроме того, не мешало бы фактически предоставить статический метод для класса Pizza, который создает объект Pizza с обязательными полями. Если, конечно, вы не уверены, что такое обязательные поля, или боитесь, что обязательные поля могут измениться в ходе эволюции вашего класса. Суть в том, что до тех пор, пока вы можете оправдывать свои действия после долгих раздумий (как говорит Джошуа Блох), вы можете спокойно игнорировать эти предупреждения, зная, что вы знаете, что делаете. : -)
Одноразовый фрагмент:
public class Pizza {
private final PizzaVO vo;
private static class PizzaVO {
int size;
boolean cheese;
boolean pepperoni;
boolean bacon;
}
public static class Builder {
private final PizzaVO vo = new PizzaVO();
public Builder(int size) {
vo.size = size;
}
public Builder cheese(boolean value) {
vo.cheese = value;
return this;
}
public Builder pepperoni(boolean value) {
vo.pepperoni = value;
return this;
}
public Builder bacon(boolean value) {
vo.bacon = value;
return this;
}
public Pizza build() {
return new Pizza(vo);
}
}
private Pizza(PizzaVO vo) {
this.vo = vo;
}
public int getSize() {
return vo.size;
}
// other getter setter methods as per your taste
}