多参构造使用构建器--effectiveJava读书笔记

简介: <p><span style="font-size:12px">对付多参的构建,特别是一些必选,一些可选的时候我们一般有如下的解决办法。</span></p> <p>比如抽象一个装机的类,  cpu,内存,主板,硬盘是必选的,但是显卡,声卡,固态硬盘是可选的。</p> <p>为了对付各种各样的装机需求。我们一般有如下办法:</p> <p>1. 重载构造器</p> <p><span

对付多参的构建,特别是一些必选,一些可选的时候我们一般有如下的解决办法。

比如抽象一个装机的类,  cpu,内存,主板,硬盘是必选的,但是显卡,声卡,固态硬盘是可选的。

为了对付各种各样的装机需求。我们一般有如下办法:

1. 重载构造器

这样可能会需要多个构造器,可读性不好。

2. 用JavaBean模式的set方法。

这种可读性要好很多,但是其能够在运行期间随意的修改,不能够保持状态,不能够通过对构造参数的校验来避免问题,并且还会给线程同步带来麻烦。

3. 就是使用构建器了,看如下的代码:

public class Computer {
	private String cpu;
	private String mainBoard;
	private String hardDisk;
	private String memory;
	private String solidDisk;
	private String videoCard;
	private String soundCard;
	
	public static class Builder{
		private String cpu;
		private String mainBoard;
		private String hardDisk;
		private String memory;
		// options
		private String solidDisk;
		private String videoCard;
		private String soundCard;
		public Builder(String cpu, String mainBoard, String hardDisk, String memory) {
			this.cpu = cpu;
			this.mainBoard = mainBoard;
			this.hardDisk = hardDisk;
			this.memory = memory;
		}
		
		public Builder solidDisk(String solidDisk){
			this.solidDisk = solidDisk;
			return this;
		}
		
		public Builder videoCard(String videoCard){
			this.videoCard = videoCard;
			return this;
		}
		
		public Builder soundCard(String soundCard){
			this.soundCard = soundCard;
			return this;
		}
		
		public Computer build(){
			return new Computer(this);
		}
	}
	
	public Computer(Builder builder){
		this.cpu = builder.cpu;
		this.mainBoard = builder.mainBoard;
		this.hardDisk = builder.hardDisk;
		this.memory = builder.memory;
		this.solidDisk = builder.solidDisk;
		this.soundCard = builder.soundCard;
		this.videoCard = builder.videoCard;
	}
}
这样Computer可以用如下的代码构造:

Computer computer = new Computer.Builder("7777", "huasuo", "rili", "kingston").solidDisk("sunsong").build();

这样带来的好处为

1. 既能想构造器那样安全,又能有比较好的可读性,如solidDisk一看就知道是给固态硬盘来赋值的。

2. 让可选参数返回builder本身,还模拟了具名参数,更加可读

3. 可以加入更多的校验

4. 更容易扩展,如果增加了新的参数,只需要新增一个方法,而不是新增n个构造器



相关文章
|
27天前
|
安全 编译器 C++
【C/C++ 基础知识 】 C++ 初始化大全:选择最适合您需求的方式
【C/C++ 基础知识 】 C++ 初始化大全:选择最适合您需求的方式
81 2
|
7月前
|
设计模式 NoSQL Java
如何用最简单的方式解释依赖注入?
如何用最简单的方式解释依赖注入?
43 0
|
8月前
|
缓存 算法 C语言
【C++技能树】Vector类解析与模拟实现
Vector是一个动态数组的容器,可以容纳各种类型的序列容器。称其为数组,意味着:**其也可以用下标去访问,类似与之前的顺序表。**所以,Vector分配空间的时候也不是说用多少就分配多少,会多分配一些,因为向系统申请空间这个成本是相对较大的。
64 0
|
11月前
|
编译器 C语言 C++
软件开发入门教程网 Search之C++ 类 & 对象
C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型。
|
12月前
|
C语言 C++
C++中的类简要介绍
C++中的类简要介绍
60 0
C#编程基础——方法
C#编程基础——方法
103 0
|
Python
第四章--第二节:类
第四章--第二节:类
84 0
|
数据采集 缓存 JavaScript
第一节--项目介绍和初始化
第一节--项目介绍和初始化
70 0
第一节--项目介绍和初始化
|
Kubernetes NoSQL 网络协议
如何用 K8s 创建一个 guestbook 留言簿应用 ?
本文介绍一个简单的K8s上手应用,希望通过这个简单的实践让大家对K8s的核心概念有更深入的理解。这个案例要在 Kubernetes 集群上部署一个名叫 guestbook 的 CURD 应用。guestbook 是 Kubernetes 社区的一个经典的应用示例,它有一个 Web 界面来让用户进行 CURD 操作,然后向一个 Redis 主节点写入数据,从多个 Redics 从节点读去数据。
681 0
如何用 K8s 创建一个 guestbook 留言簿应用 ?
|
算法 程序员 网络架构
带你读《计算机程序的构造和解释(原书第2版)典藏版》之二:构造数据抽象
《计算机程序的构造和解释(原书第2版)》1984年出版,成型于美国麻省理工学院(MIT)多年使用的一本教材,1996年修订为第2版。在过去的二十多年里,《计算机程序的构造和解释(原书第2版)》对于计算机科学的教育计划产生了深刻的影响。第2版中大部分重要程序设计系统都重新修改并做过测试,包括各种解释器和编译器。作者根据其后十余年的教学实践,还对其他许多细节做了相应的修改。