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

/**
 * 如果类的构造器或者静态工厂中具有多个参数,设计这种类时,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();
    }
}  
时间: 2024-08-18 21:36:41

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

【读书笔记 - Effective Java】02. 遇到多个构造器参数时要考虑用构建器

类有多个可选参数的解决方案:1. 重叠构造器模式可行,但是当有许多参数的时候,客户端代码会很难编写,并且仍然较难以阅读.2. JavaBeans模式,调用一个无参构造器来创造对象,然后调用setter方法来设置每个必要的参数,以及每个相关的可选参数. 缺点:构造过程被分到了几个调用中,在构造过程中JavaBean可能处于不一致的状态.阻止了把类做成不可变的可能,需要程序员确保线程安全.3. Builder模式,模拟了具名的可选参数. 模式 优 劣 重叠构造器 写法最简单 多参数时候难读.难写.难

第二章:创建和销毁对象。ITEM2:遇到多个构造器参数时要考虑用构建器。

如果一个类中有大量的可选参数,有以下几种方式: 1.重叠构造器: package com.twoslow.cha2; /** * 重叠构造器可行,但是当由许多参数的时候,客户端代码很难编写. * @author sai * */ public class Item201 { private final int servingSize; private final int servings; private final int calories; private final int fat; pr

第二条:遇到多个构造器参数时要考虑用构建器

静态工厂和构造器有个共同的局限性:它们都不能很好地扩展到大量的可选参数. 假如一份营养成分的标签,有两个域是必须的,四个域是可选的. 1.重叠构造器模式 提供一个只有必要参数的构造器,第二个构造器有一个可选参数,第三个构造器有两个可选参数,依次类推,直到最后一个构造器包含所有的可选参数. 缺点:谁作为第一个可选参数是一个问题,因为后一个包含两个可选参数的构造器必须传递值给第一个可选参数,导致需要设置许多本不想设置的参数,像是一个极端的例子NutritionFacts n = new Nutrit

Effective Java 读书笔记(一):使用静态工厂方法代替构造器

这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文<java中final与static的使用场景总结>. 什么是静态工厂方法? 可以参考书中的例子(摘自JDK1.7 java.lang.Boolean) public final class Boolean implements java.io.Serializable, Comparable<

覆盖equals时请遵守通用约定——Effective Java 读书笔记

如果满足了以下任一条件,这就正是所期望的结果: 类的每个实例本质上都是唯一的. 不关心类是否提供了"逻辑相等"的测试功能. 超类已经覆盖了equals,从超类继承过来的行为对于子类也是适合的. 类是私有的或是包级私有的,可以确定它的equals方法永远不会被调用. 如果类具有自己特有的"罗吉相等"概念(不同于对象等同的概念),而且超类还,没有覆盖equals以实现期望的行为,这时我们就需要覆盖equals方法. equals方法实现了等价关系: 自反性 对称性 传递

用私有构造器或者枚举类型强化singleton属性——Effective Java 读书笔记

/** * 实现singleton的第二种方法,共有成员是个静态工厂方法. * (第一种方法中公有静态成员是个final域,即直接使用private static final Singleton INSTANCE = new Singleton();) * @author 刘向峰 * */ public class Singleton { private static final Singleton INSTANCE = new Singleton(); /** * 享有特权的客户端可以借助 j

Effective java读书札记第一条之 考虑用静态工厂方法代替构造器

对于类而言,为了让客户端获取它资深的一个实例,最常用的方法就是提供一个共有的构造器.还有一种放你发,也应该子每个程序员的工具箱中占有一席之地.类可以提供一个共有的静态 工厂方法,它只是返回类的实例的静态方法. 类可以通过静态工厂方法类提供它的客户端(对象),而不是通过构造器.提这样做的好处有: 1.静态工厂方法与构造器不同的第一大优势在于,它们有名称.比如构造器BigInteger(int,int,Random)返回的BigInteger可能为素数,如果用名为BigInteger.probabl

第二条 遇到多个构造器参数时,要考虑用构建器

静态工厂和构造器都有个共同的局限性,就是它们都不能够很好的扩展到大量的可选参数. 如: 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 Nu

Effective Item 2 - 遇到多个构造器参数时考虑使用Builder

静态工厂和够构造器有一个共同的局限性:遇到大量的参数时无法很好的扩展. 先说说构造器. 其实field不多时重叠构造器(telescoping constructor)是个不错的方法,易于编写也易于调用,这种方式在参数数量较少时也很常见. 但问题是参数很多(可能越来越多)时,比如(现在已经很难找到对多个参数进行重叠构造的代码了,于是在这里直接引用一下书中的代码): public class NutritionFacts { private final int servingSize; // (m