《Effective Java 第三版》读书笔记 - Item 2:构造函数参数过多时,建议使用 Builder

重叠构造器模式

  • 重叠构造器模式(telescoping constructor pattern)采用前面是必选参数,后面是可选参数的模式
  • 由于 Java 不支持缺省参数,所以会采用多个构造函数,每个构造函数增加一个可选参数的声明方式
public class NutritionFacts {
    ...
    public NutritionFacts(int servingSize, int servings) {
        ...
    }

    public NutritionFacts(int servingSize, int servings, int calories) {
        ...
    }

    public NutritionFacts(int servingSize, int servings, int calories, int fat) {
        ...
    }

    public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium) {
        ...
    }

    public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium, int carbohydrate) {
        ...
    }
}
  • 创建实例时,使用一下代码
NutritionFacts cocaCola = new NutritionFacts(240, 8, 100, 0, 35, 27);

重叠构造器模式的缺点

  • 构造函数声明冗长
  • 使用时,代码不直观,不容易理解

JavaBean 模式

  • 空构造函数
  • 使用 set 系列方法来设置

JavaBean 模式的缺点

  • 字段的设置是随机顺序的,无法保持一个统一的内部状态
  • 无法事先不可变性质的类,需要额外的努力来实现线程安全

Builder 模式 (推荐)

  • 源自设计模式的 Builder pattern,但不尽相同
  • 使用代码
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)
            .calories(100)
            .sodium(35)
            .carbohydrate(27)
            .build();
  • 在生成对象时,可统一检查参数的有效性(build 方法中)
  • 支持类继承关系和层次结构(见原书的例子,有更详尽的说明,如递归类型参数)
  • 比之 JavaBean 模式,更加安全
  • 但是,也更加重一些,如果注重极端性能,可考虑优化
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。