2015-03-05 5 views
3

Я читаю «Эффективное издание 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);

Так что же преимущество, например, из книга? Я вижу только неизменность, которая невозможна при моем решении.

+4

Да, неизменность. Ваша реализация на самом деле не является строителем - это просто изменяемый тип. Если вы хотите изменить тип, вам не нужен строитель. Лично мне нравится неизменность во многих контекстах. –

+1

Сначала вы ошибаетесь в первом застройщике, вы создаете два экземпляра NutritionFacts. Вы должны сделать 'NutritionFacts.Builder(). Calories (300) .build()' или 'Builder(). Calories (300) .build()' и, во-вторых, как @JonSkeet сказал, ваша реализация не является застройщиком – user902383

ответ

1

Вы используете Eclipse? В этом случае я рекомендую вам установить аддон/плагин Fluent Builder. Я использую его довольно часто для создания строителей объектов для целей тестирования.

Этот плагин генерирует очень хороший пример построения построителя. Я должен признать, что это не чистый шаблон Builder, а Fluent Pattern. Во всяком случае, я считаю, что его код очень хорош для вас, чтобы узнать цель шаблона Builder и его преимущества.

+0

Нет , Я использую IntelliJ. Вопрос заключается не в создании, а в том, что является целью строителя. – GarfieldKlon

Смежные вопросы