Effective Java 创建和销毁对象 2.遇到多个构造器参数时要考虑用构建器
静态工厂跟构造器都有一个共同的局限性:不能很好的扩展到大量的参数。
例:
package com.example.yancy.yancy;
/**
* Created by yancy on 2017/8/24.
*/
public class Person {
/**
* 姓名
*/
private String name;
/**
*性别
*/
private String sex;
/**
*年龄
*/
private int age;
/**
*唯一识别(身份证)
*/
private String uuid;
/**
*状态
*/
private int status;
/**
* 事迹
*/
private String deed;
public Person() {
}
public Person(String name, String uuid) {
this.name = name;
this.uuid = uuid;
}
public Person(String name, String sex, String uuid) {
this.name = name;
this.sex = sex;
this.uuid = uuid;
}
public Person(String name, String sex, int age, String uuid) {
this.name = name;
this.sex = sex;
this.age = age;
this.uuid = uuid;
}
public Person(String name, String sex, int age, String uuid, int status) {
this.name = name;
this.sex = sex;
this.age = age;
this.uuid = uuid;
this.status = status;
}
public Person(String name, String sex, int age, String uuid, int status, String deed) {
this.name = name;
this.sex = sex;
this.age = age;
this.uuid = uuid;
this.status = status;
this.deed = deed;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getDeed() {
return deed;
}
public void setDeed(String deed) {
this.deed = deed;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", uuid='" + uuid + '\'' +
", status=" + status +
", deed='" + deed + '\'' +
'}';
}
}
为了得到Person的实例,我们往往会传递大量的用不上的参数,上面的参数还算比较少,随着属性的增加,构造器繁多,不利于管理与阅读。
而且以上还只是Person的一点点属性,还有 生日、学历、地址...
总结:重叠构造器模式可行,但是到参数繁多时,客户端代码难以编写,并且难以阅读。
当然也可以使用无参构造器+get() set()方法。
遗憾的是JavaBeans模式自身有严重的确定啊。因为构造过程被分到几个调用中,会让JavaBeans可能处于不一致的状态,这就需要付出额外的努力来保证线程安全。
幸运的是还有第三种方法,既能保证像重叠构造器模式的安全性,也保证像JavaBeans模式的可读性。
例:
new AlertDialog.Builder(MainActivity.this)
.setCancelable(false)
.setTitle("详细信息")
.setMessage(message)
.setPositiveButton(getString(R.string.cancel), null)
.create()
.show();
简而言之,如果类的构造器或者静态工厂中具有多个参数,设计这种类时,Builder就是不错的设计模式。
package com.example.yancy.yancy;
/**
* Created by yancy on 2017/8/24.
*/
public class Person {
/**
* 姓名
*/
private final String name;
/**
* 性别
*/
private final String sex;
/**
* 年龄
*/
private final int age;
/**
* 唯一识别(身份证)
*/
private final String uuid;
/**
* 状态
*/
private final int status;
/**
* 事迹
*/
private final String deed;
public static class Builder {
/**
* 姓名
*/
private String name = "";
/**
* 性别
*/
private String sex = "";
/**
* 年龄
*/
private int age = -1;
/**
* 唯一识别(身份证)
*/
private String uuid = "";
/**
* 状态
*/
private int status = -1;
/**
* 事迹
*/
private String deed = "";
public Builder() {
}
public Builder Name(String name) {
this.name = name;
return this;
}
public Builder Sex(String sex) {
this.sex = sex;
return this;
}
public Builder Age(int age) {
this.age = age;
return this;
}
public Builder Uuid(String uuid) {
this.uuid = uuid;
return this;
}
public Builder Status(int status) {
this.status = status;
return this;
}
public Builder Deed(String deed) {
this.deed = deed;
return this;
}
/**
* 调用私有构造器
* 这个方法必须调用
*
* @return
*/
public Person builder() {
return new Person(this);
}
}
/**
* 私有构造器
*
* @param builder
*/
private Person(Builder builder) {
name = builder.name;
sex = builder.sex;
age = builder.age;
uuid = builder.uuid;
status = builder.status;
deed = builder.deed;
}
/**
* 调用
*
* @param args
*/
public static void main(String[] args) {
//用哪个参数就调用哪个参数
Person person = new Builder().Name("张三").Sex("M").Age(18).Uuid("08156565418115151").Status(0).Deed("").builder();
}
}
Effective Java 创建和销毁对象 2.遇到多个构造器参数时要考虑用构建器相关推荐
- java创建和销毁一个对象_有效的Java –创建和销毁对象
java创建和销毁一个对象 创建和销毁对象(第2章) 这是Joshua Blochs的< 有效的Java>第2章的简短摘要.我仅包括与自己相关的项目. 静态工厂(项目1) 静态工厂与构造函 ...
- 有效的Java –创建和销毁对象
创建和销毁对象(第2章) 这是Joshua Blochs的< 有效的Java>第2章的简短摘要.我仅包括与自己相关的项目. 静态工厂(项目1) 静态工厂与构造函数的一些优点: 工厂方法的名 ...
- effective java 3th item2:考虑 builder 模式,当构造器参数过多的时候
yiaz 读书笔记,翻译于 effective java 3th 英文版,可能有些地方有错误.欢迎指正. 静态工厂方法和构造器都有一个限制:当有许多参数的时候,它们不能很好的扩展. 比如试想下如下场景 ...
- Effective Java:创建和销毁对象
前言: 读这本书第1条规则的时候就感觉到这是一本很好的书,可以把我们的Java功底提升一个档次,我还是比较推荐的.本博客是针对<Effective Java>这本书第2章所写的一篇读书笔记 ...
- Effective java 总结1 - 创建和销毁对象
Effective java 总结 - 创建和销毁对象 第1条 用静态工厂方法代替构造器 优势 静态工厂方法有名称 不必每次调用的时候创建一个新的对象 可以返回原返回类型的任何子类型对象 返回对象的类 ...
- 《Effective Java》学习笔记 第二章 创建和销毁对象
第二章 创建和销毁对象 何时以及如何创建对象,何时以及如何避免创建对象,如何确保他们能够适时地销毁,以及如何管理对象销毁之前必须进行的各种清理动作. 1 考虑用静态工厂方法代替构造器 一般在某处获取一 ...
- Effective Java读书笔记---二、创建和销毁对象
二.创建和销毁对象 何时以及如何创建对象, 何时以及如何避免创建对象, 如何确保它们能够适时地销毁, 如何管理对象销毁之前必须进行的各种清理动作 1.用静态工厂方法代替构造器 优势: 它们有名称 不必 ...
- Effictive Java学习笔记1:创建和销毁对象
建议1:考虑用静态工厂方法代替构造器 理由:1)静态方法有名字啊,更容易懂和理解.构造方法重载容易让人混淆,并不是好主意 2)静态工厂方法可以不必每次调用时都创建一个新对象,而公共构造函数每次调用都会 ...
- 如何销毁一个实例化对象_JAVA中如何创建和销毁对象
第1条 考虑用静态方法代替构造器 类可以通过静态工厂方法来提供它的客户端,而不是通过构造器.提供静态工厂方法而不是公有构造器,这样做具有几大优势. 1.静态工厂方法与构造器不同的第一大优势在于,它们有 ...
最新文章
- python[外星人入侵] 项目
- 定义一个DOG类(Java)
- linux ln 权限不够,每次执行./都会出现权限不够,已经是root了 已解决!
- VS.NET中的生成解决方案和重新生成解决方案有什么区别?
- 题解 UVA10298 【Power Strings】
- C++之抽象基类与纯虚函数
- 全新 Win 9 概念 界面漂亮极了
- aws java mysql_java - AWS EC2 / MySql - spring boot无法从datasource确定jdbc url - 堆栈内存溢出...
- Node.js webpack webpack-dev-server
- swift-01-利用元组判断字符串出现次数
- BCS冬奥主题活动日:奥运网络安全成全球关注焦点
- hdu 1421 搬寝室
- html语言汇总,第三讲HTML语言全面介绍汇总.ppt
- 如何选择InstallShield工程类型
- 【概率论】高斯分布、中心极限定理、伯努利分布、二项分布
- 【先锋】七牛云存储:三年磨一剑及背后核心技术解析
- linux hba卡超时时间,如何设置Emulex HBA 卡超时参数
- 在外部JS中使用validity进行表单验证出现未定义问题
- 刷机前忘记退出Google账号解决方案
- 养生之道——》早上刷牙干呕&&慢性烟炎
热门文章
- 合肥工业大学计算机与信息学院罗徇,合肥工业大学计算机与信息学院导师介绍:吴共庆...
- python 实现对地图的点击_利用python和百度地图API实现数据地图标注的方法
- ESP8266-Arduino编程实例-OLED显示电容式土壤湿度传感器数据
- java thrift_Thrift入门及Java实例演示【转】
- 如何避免“中间人”攻击
- 中小河流雨水情监测_水文监测预警系统
- 一种实现PC端影音收录的方法 (4test)
- TMS320F28xx SPI master/slave example
- 访问学者出国申请可以分为哪几类?
- LINUX These critical programs are missing or too old: bison compiler python