Я читаю «Эффективное издание Java 2n» от Джошуа Блоха. Мой вопрос касается пункта 2 «Рассмотрите строителя, столкнувшись со многими параметрами конструктора».Какой подход строителя предпочтительнее?
Укороченный пример из книги:
public class NutritionFacts {
private final int calories;
public static class Builder {
private int calories = 0;
public Builder(){}
public Builder calories(int val) {
calories = val;
return this;
}
public NutritionFacts build(){
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder){
calories = builder.calories;
}
}
вызвать его: NutritionFacs cocaCola = new NutritionFacts.Builder().calories(300).build()
Моя версия
public class NutritionFacts {
private int calories;
public NutritionFacts calories(int calories) {
this.calories = calories;
return this;
}
}
Invoke: NutritionFacts cocaCola = new NutritionFacts().calories(300);
Так что же преимущество, например, из книга? Я вижу только неизменность, которая невозможна при моем решении.
Да, неизменность. Ваша реализация на самом деле не является строителем - это просто изменяемый тип. Если вы хотите изменить тип, вам не нужен строитель. Лично мне нравится неизменность во многих контекстах. –
Сначала вы ошибаетесь в первом застройщике, вы создаете два экземпляра NutritionFacts. Вы должны сделать 'NutritionFacts.Builder(). Calories (300) .build()' или 'Builder(). Calories (300) .build()' и, во-вторых, как @JonSkeet сказал, ваша реализация не является застройщиком – user902383