码迷,mamicode.com
首页 > 编程语言 > 详细

遇到多个构造器参数时要考虑用构建器——Effective Java 读书笔记

时间:2015-02-13 16:39:14      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:代码   模式   设计   构建器   

/**
 * 如果类的构造器或者静态工厂中具有多个参数,设计这种类时,Builder模式就是种不错的选择,特别是当大多数参数都是可选的时候。
 * 与使用传统的重叠构造器模式相比,使用Builder模式的客户端代码将更易于阅读和编写,构建器也比JavaBeans更加安全。
 * 
 * @author 刘向峰
 * 
 */
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;
    public static class Builder {
        // 必须的参数,final保证了它必须被赋值
        private final int servingSize;
        private final int servings;
        // 可选项
        private int calories = 0;
        private int fat = 0;
        private int sodium = 0;
        private int carbohydrate = 0;
        /**
         * 在构造函数中完成对必须参数的初始化
         * 
         * @param servingSize
         * @param servings
         */
        public Builder(int servingSize, int servings) {
            this.servingSize = servingSize;
            this.servings = servings;
        }
        /**
         * 
         * @param val
         *            对可选项进行赋值
         * @return Builder对象,以进行链式调用赋值函数
         */
        public Builder calories(int val) {
            calories = val;
            return this;
        }
        public Builder fat(int val) {
            fat = val;
            return this;
        }
        public Builder sodium(int val) {
            sodium = val;
            return this;
        }
        public Builder carbohydrate(int val) {
            carbohydrate = val;
            return this;
        }
        /**
         * 创建获取对象方法,将自己(Builder)作为参数传入
         * 
         * @return NutritionFacts对象
         */
        public NutritionFacts build() {
            return new NutritionFacts(this);
        }
    }
    /**
     * 私有化构造函数,保证对同一个对象进行操作
     * 
     * @param builder传入构造器进行赋值
     */
    private NutritionFacts(Builder builder) {
        servingSize = builder.servingSize;
        servings = builder.servings;
        calories = builder.calories;
        fat = builder.fat;
        sodium = builder.sodium;
        carbohydrate = builder.carbohydrate;
    }
    /**
     * 测试方法
     * 
     * @param args
     */
    public static void main(String[] args) {
        NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)
                .calories(100).sodium(35).carbohydrate(27).build();
    }
}  

遇到多个构造器参数时要考虑用构建器——Effective Java 读书笔记

标签:代码   模式   设计   构建器   

原文地址:http://blog.csdn.net/lxf_44944/article/details/43794685

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!