Некоторые изменения в шаблоне Builder, представленные Джошуа Блохом - PullRequest
5 голосов
/ 15 сентября 2010

Я использую шаблон Java Builder, представленный Джошуа Блохом.Иногда я нахожу некоторые поля, которые дороже инициализировать со значением по умолчанию по сравнению с примитивными типами.

Следовательно, моя стратегия такова.

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

Я не уверен, является ли это хорошо сделать это?Есть ли какой-нибудь подвох?Типа, вопросы безопасности потока?Пока что я не вижу никаких проблем с этим.

package sandbox;

import java.util.Calendar;

/**
 *
 * @author yccheok
 */
// Builder Pattern
public class NutritionFacts {
    private final int servingSize;
    private final int servings;
    private final int calories;
    private final int fat;
    private final int sodium;
    private final int carbohydrate;

    private final java.util.Calendar calendar;    // !!!

    public static class Builder {
        // Required parameters
        private final int servingSize;
        private final int servings;
        // Optional parameters - initialized to default values
        private int calories = 0;
        private int fat = 0;
        private int carbohydrate = 0;
        private int sodium = 0;

        // We suppose to provide a default value for calendar. However, it may
        // seem expensive. We will do it later during build.        
        private java.util.Calendar calendar = null;

        public Builder(int servingSize, int servings) {
            this.servingSize = servingSize;
            this.servings = servings;
        }
        public Builder calories(int val)
        { calories = val; return this; }
        public Builder fat(int val)
        { fat = val; return this; }
        public Builder carbohydrate(int val)
        { carbohydrate = val; return this; }
        public Builder sodium(int val)
        { sodium = val; return this; }

        public NutritionFacts build() {
            // !!!
            if (this.calendar == null) {
                this.calendar = Calendar.getInstance();
            }            
            return new NutritionFacts(this);
        }
    }

    private NutritionFacts(Builder builder) {
        servingSize = builder.servingSize;
        servings = builder.servings;
        calories = builder.calories;
        fat = builder.fat;
        sodium = builder.sodium;
        carbohydrate = builder.carbohydrate;
        calendar = builder.calendar;
    }
}

Ответы [ 3 ]

4 голосов
/ 15 сентября 2010

что если я действительно хочу, чтобы календарь был нулевым?Ваша модель не будет работать тогда.В противном случае мне кажется, что все в порядке.

3 голосов
/ 15 сентября 2010

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

2 голосов
/ 15 сентября 2010

Будьте осторожны, так как Календарь является изменяемым, поэтому вы должны защищенно скопировать его в конструктор NutritionFacts.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...