在Java中遇到多个参数时,有3种方式可以构造类。

一、重叠构造器(telescoping constructor)模式

这种模式下,在类中有多个使用不同参数的构造函数,需要什么参数,就写一个相应的构造函数。结果是随着参数数目的增加,代码臃肿不堪。

二、JavaBean模式

这种模式下,通过调用一个无参构造函数来创建对象,然后通过setter方法来设置必要的参数。这种代码创建实例很容易,读起来也不费力,但是它将构造过程分到了很多setter调用中,设置参数的时候,JavaBean可能处于不一致的状态。类无法仅仅通过检验构造器参数的有效性保证一致性。

三、Builder模式

Builder模式像个构造器一样,它的setter方法返回builder本身,以便可以把调用链接起来。安卓里面AlertDialog就是通过Builder模式来初始化的。下面是Effective Java书中的一个例子,在此作了部分修改和简化,其中Builder类通过书中提到的泛型来实现

public class NutritionFacts {private final int size;private final int fat;private final int sodium;private final int calories;private NutritionFacts(Builder builder) {this.size = builder.size;this.fat = builder.fat;this.sodium = builder.sodium;this.calories = builder.calories;}public int getSize() {return size;}public int getFat() {return fat;}public int getSodium() {return sodium;}public int getCalories() {return calories;}public static class Builder implements BuilderInterface<NutritionFacts> {// Required parametersprivate final int size;private final int fat;// Optional parameters - initialized to default valuesprivate int sodium = 0;private int calories = 0;public Builder setSodium(int sodium) {this.sodium = sodium;return this;}public Builder setCalories(int calories) {this.calories = calories;return this;}public Builder(int size, int fat) {this.size = size;this.fat = fat;}@Overridepublic NutritionFacts build() {return new NutritionFacts(this);}}
}

BuilderInterface接口如下所示:

public interface BuilderInterface<T> {T build();
}

这样,新建一个NutritionFacts对象,只需要使用下面的代码:

NutritionFacts cocaCola = new NutritionFacts.Builder(1,2).setSodium(3).setCalories(4).build();

在此需要注意的地方有:

1. 初始化必须使用的变量使用final修饰,是为了防止变量发生变化,只允许初始化设值。

2. NutritionFacts的构造函数使用private修饰,即只允许通过Builder来实例化对象。

总结

简而言之,如果类的构造器或者静态工厂中具有多个参数,设计这种类时,Builder模式就是种不错的选择,特别是当大多数参数都是可选的时候。与使用传统的重叠构造器模式相比,使用Builder模式的客户端代码将更易于阅读和编写,构建器也比JavaBean更加安全。

Effective Java:Builder模式相关推荐

  1. JAVA Builder模式构建MAP/LIST的示例

    我们在构建一个MAP时,要不停的调用put,有时候看着觉得很麻烦,刚好,看了下builder模式,觉得这思路不错,于是乎,照着用builder模式写了一个构建MAP的示例,代码如下: import j ...

  2. Java 设计模式 --- Template 模式 Java Template 模式 Java 模板设计模式

    Java 设计模式 --- Template 模式 Java Template 模式 Java 模板设计模式 一.概述 模板设计模式: 父类定义通用抽象的功能方法,子类负责具体的实现. 本文将以一个通 ...

  3. effective java 3th item2:考虑 builder 模式,当构造器参数过多的时候

    yiaz 读书笔记,翻译于 effective java 3th 英文版,可能有些地方有错误.欢迎指正. 静态工厂方法和构造器都有一个限制:当有许多参数的时候,它们不能很好的扩展. 比如试想下如下场景 ...

  4. effective java之 builder模式

    在java开发中我们经常需要创建对象 ,我们常用的创建对象的方法有两种  1  使用构造器来创建对象 如果有多个可变参数 ,就需要写多个构造方法,这种方法在遇到多个参数时不好控制 2. javabea ...

  5. java的设计模式 - Builder模式

    Builder 模式的目的? 构造对象的方式过于复杂,不如将之抽离出来.比如,构造器参数过多 这样说也有点抽象,举个例子吧. 举个例子 比如 非常热门的消息队列RabbitMQ 的 AMQP.Basi ...

  6. Effective Java(一)———— 代替构造器和Setter的构建器模式

    引言 Java语言中的一部经典著作<Effective Java>,里面涵盖了78条我们应该熟练的Java编程技巧. 本篇博客是该书学习的系列笔记第一篇.本系列博客不会与书中的78条建议完 ...

  7. Java 高效编程之 Builder 模式

    前言 在<Effective Java 第2版>中有提到,遇到多个构造器参数时要考虑使用构建器(Builder模式).相比于重叠构造器(telescoping constructor)模式 ...

  8. 【读书笔记】《Effective Java》第二章 第2条:遇到多个构造器参数时要考虑使用Builder

    一.前言 <Effective Java>读书笔记系列 第二章 第1条:创建和销毁对象 第二章 第2条:遇到多个构造器参数时要考虑使用Builder 二.介绍 我们开发中偶尔会遇到一些需要 ...

  9. Java高效编程之Builder模式

    前言 在<Effective Java 第2版>中有提到,遇到多个构造器参数时要考虑使用构建器(Builder模式).相比于重叠构造器(telescoping constructor)模式 ...

最新文章

  1. ORB-SLAM2从理论到代码实现(七):Tracking.cc程序详解(中)
  2. 微信小程序---导航(navigator)
  3. 一次搞定:分布式缓存 Redis 集群搭建!
  4. URL(统一资源定位符)
  5. 代码实现两个数交换方法
  6. TS对象中的实例属性和静态属性
  7. jdk8切换成jdk6_运行中的JDK语言功能预览:切换表达式
  8. 【C/C++】顺序容器list和vector
  9. qt4--qt5引用头文件区别
  10. Atitit lucence es solr的各种query 与sql运算符的对比 目录 1.1. 等于运算 TermQuery 1 1.2. 范围运算 1 1.3. 大小运算 1 1.4. Wi
  11. 华为薪酬体系的整体框架
  12. 图书馆借阅系统(应用)的设计与实现
  13. Easyui三级目录菜单+手风琴+spring mvc
  14. PHPCMS 前台模板集合
  15. MySQLyog的使用
  16. 离散型随机变量及其分布
  17. SwipeRefreshLayout极其简单的下拉刷新工具
  18. gmail发邮件一直失败,解决办法
  19. 使用LVM动态管理4T以上硬盘
  20. ios 往 Library的cache目录下 存放缓存数据的方法

热门文章

  1. 日语蔬菜水果相关词汇(1)
  2. 系统项目验收测试报告怎么做,2021最新测试报告收费情况
  3. matlab修改图像分辨率_matlab – 增加灰度图像的分辨率
  4. 【自考必看】《信息资源管理基础》信息资源管理基础,第1章,速通指南
  5. Task3 特征工程
  6. 安装Selenium2Library步骤以及加载Selenium2Library时为红色
  7. [Linux入门系列].1.2.VMWare WorkStation和VMPlayer的安装
  8. 触宝纽交所上市:十年磨一剑 要打造世界一流AI公司
  9. ubuntu18安装office2010
  10. 四个步骤实现在ESRI ArcMap中加载17.6G离线卫星地图的方法