Joshua Bloch介绍的Builder模式的一些修改

Che*_*eng 5 java

我使用Joshua Bloch介绍的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

nan*_*nda 4

如果我真的希望日历为空怎么办?那么你的模式就行不通了。否则,对我来说似乎还可以。