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

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

模式
重叠构造器 写法最简单 多参数时候难读、难写、难用
JavaBeans 创建实例简单 构造过程可能不一致
Builder
多参数时候易写、易读

构造过程一致

创建构建器有开销
// Builder模式示例
public class NutritionFacts {
    private final int servingSize; // 必选参数
    private final int servings; // 必选参数
    private final int fat; // 可选参数
    private final int sodium; // 可选参数

    public static class Builder {
        private final int servingSize;
        private final int servings;
        private int fat = 0;
        private int sodium = 0;

        public Builder(int servingSize, int servings) {
            this.servingSize = servingSize;
            this.servings = servings;
        }

        public Builder fat(int val) {
            fat = val;
            return this;
        }

        public Builder sodium(int val) {
            sodium = val;
            return this;
        }

        public NutritionFacts build() {
            return new NutritionFacts(this);
        }
    }

    private NutritionFacts(Builder builder) {
        servingSize = builder.servingSize;
        servings = builder.servings;
        fat = builder.fat;
        sodium = builder.sodium;
    }
}
// 调用
NutritionFacts coca = new NutritionFacts.Builder(240, 8).fat(5).build();

Java中传统的抽象工厂实现是Class对象,用newInstance方法充当build方法的一部分。然而newInstance方法总是企图调用类的无参构造器,但是有的类没有无参构造器,这时也不会收到编译时错误。Class.newInstance破坏了编译时的异常检查。

原文地址:https://www.cnblogs.com/sei-cxt/p/8718499.html

时间: 2024-10-13 12:24:35

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

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

/** * 如果类的构造器或者静态工厂中具有多个参数,设计这种类时,Builder模式就是种不错的选择,特别是当大多数参数都是可选的时候. * 与使用传统的重叠构造器模式相比,使用Builder模式的客户端代码将更易于阅读和编写,构建器也比JavaBeans更加安全. * * @author 刘向峰 * */ public class NutritionFacts { // 所有的参数 private final int servingSize; private final int servin

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

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

[读书笔记]Effective Java 第一章

需要了解JAVA最近每个版本新增的特性,并善用这些新特性为自己的程序实现高效简洁的代码. 其中提到的编程原则包括: 模块要尽可能的小 代码应该要被重用,而不是被拷贝 模块之间的依赖性应该尽可能降到最小 错误应该尽早被检测,最好是在编译期

[读书笔记]Effective Java 第四章

使类和成员的可访问性最小化 规则很简单:尽可能地使每个类或者成员不被外界访问.实例域(非final)决不能是公有的.当需要暴露出不可变的实例时通常会把这个实例做成不可变或者是把这个实例变成私有,同时提供该实例的备份. 在公有类中使用访问方法而非公有域 这就是常说的getter和setter方法,提供给包外访问时提供必要的方法,限制客户端的行为,以便于将来可以在内部改变表示方法. 使可变性最小化 不可变的类比可变类更加易于设计.实现和使用.它们不容易出错,且更加安全.为了使类成为不可变,要遵循下面

[读书笔记]Effective Java 第三章

覆盖equals方法时请遵守通用约定 这种说法的大意是要说明,Object类中定义的很多默认准则是被许多工具类或是第三方框架共同遵守的标准,一旦改动这样的标准机制,会在后续的使用中产生不稳定因素.equals方法常见用来做以下用途时,不建议对equals方法进行覆盖: 1.判断实例的唯一性 2.提供某种程度的逻辑相等 equals方法满足自反性,对称性,传递性,一致性,非空性.当需要覆盖equals方法时,需要注意以下三点: 1.覆盖equals时总要覆盖hashCode 2.不要企图让equa

[读书笔记]Effective Java 第二章

考虑用静态工厂方法代替构造器 静态工厂方法第一大优势是可以用特有的名称.常见的类创建实例需要用构造函数,而当需要两个构造函数时,我们需要在参数列表做区分才能写出两个构造方法.使用静态工厂模式,可以规避方法名=类名的限制,使用更易读的方法呈现. 静态工厂方法第二大优势是不必在每次调用的时候创建一个新的实例.这点和单例设计模式有些类似,在使用不可变类的时候可以预先构建实例并缓存,之后可以重复利用,避免创建不必要的重复对象,也可以用静态工厂保证这是一个单例.可以确保不会存在两个相等的实例,即当且仅当a

【读书笔记 - Effective Java】01. 考虑用静态工厂方法代替构造器

获取类的实例有两种方法: 1. 提供一个公有的构造器(最常用). 2. 提供一个公有的静态工厂方法(static factory method). // 静态工厂方法示例 public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 静态工厂方法的优势: 1. 有名称.当一个类需要多个带有相同签名(方法签名 = 方法名 + 参数列表)的构造器时,就用静态工厂方法代替构造器,并且慎重选择名

读书笔记 effective c++ Item 44 将与模板参数无关的代码抽离出来

1. 使用模板可能导致代码膨胀 使用模板是节省时间和避免代码重用的很好的方法.你不需要手动输入20个相同的类名,每个类有15个成员函数,相反,你只需要输入一个类模板,然后让编译器来为你实例化20个特定的类和300个你需要的函数.(只有在被使用的情况下类模版的成员函数才会被隐式的实例化,所以只有在300个函数被实际用到的情况下才会生成300个成员函数.)函数模板同样吸引人.你不用手动实现许多函数,你只需要实现一个函数模板,然后让编译器来做余下的事情. 然而在有些时候,如果你不小心,使用模板会导致代

【java读书笔记】——java的异常处理

程序在实际环境的运行过程中,安全成为需要首先考虑的重要因素之一,这也是用户和程序员最关心的问题.同时,Java语言健壮性也体现在了能够及时有效地处理程序中的错误,准确的说是Java的异常处理机制为解决安全问题提交了一份满意的答卷. 先从整体上看一下本文要介绍的内容,然后进行详细的分析: 1.异常的概念 异常又称为例外,是特殊的运行错误对象,对应着Java语言特定的运行错误处理机制. 上面的概念是书本上说的,下面我谈一下自己的看法 其实异常处理机制提供了统一的机制来识别和响应程序错误,异常可以为我