静态工厂跟构造器都有一个共同的局限性:不能很好的扩展到大量的参数。

例:

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.遇到多个构造器参数时要考虑用构建器相关推荐

  1. java创建和销毁一个对象_有效的Java –创建和销毁对象

    java创建和销毁一个对象 创建和销毁对象(第2章) 这是Joshua Blochs的< 有效的Java>第2章的简短摘要.我仅包括与自己相关的项目. 静态工厂(项目1) 静态工厂与构造函 ...

  2. 有效的Java –创建和销毁对象

    创建和销毁对象(第2章) 这是Joshua Blochs的< 有效的Java>第2章的简短摘要.我仅包括与自己相关的项目. 静态工厂(项目1) 静态工厂与构造函数的一些优点: 工厂方法的名 ...

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

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

  4. Effective Java:创建和销毁对象

    前言: 读这本书第1条规则的时候就感觉到这是一本很好的书,可以把我们的Java功底提升一个档次,我还是比较推荐的.本博客是针对<Effective Java>这本书第2章所写的一篇读书笔记 ...

  5. Effective java 总结1 - 创建和销毁对象

    Effective java 总结 - 创建和销毁对象 第1条 用静态工厂方法代替构造器 优势 静态工厂方法有名称 不必每次调用的时候创建一个新的对象 可以返回原返回类型的任何子类型对象 返回对象的类 ...

  6. 《Effective Java》学习笔记 第二章 创建和销毁对象

    第二章 创建和销毁对象 何时以及如何创建对象,何时以及如何避免创建对象,如何确保他们能够适时地销毁,以及如何管理对象销毁之前必须进行的各种清理动作. 1 考虑用静态工厂方法代替构造器 一般在某处获取一 ...

  7. Effective Java读书笔记---二、创建和销毁对象

    二.创建和销毁对象 何时以及如何创建对象, 何时以及如何避免创建对象, 如何确保它们能够适时地销毁, 如何管理对象销毁之前必须进行的各种清理动作 1.用静态工厂方法代替构造器 优势: 它们有名称 不必 ...

  8. Effictive Java学习笔记1:创建和销毁对象

    建议1:考虑用静态工厂方法代替构造器 理由:1)静态方法有名字啊,更容易懂和理解.构造方法重载容易让人混淆,并不是好主意 2)静态工厂方法可以不必每次调用时都创建一个新对象,而公共构造函数每次调用都会 ...

  9. 如何销毁一个实例化对象_JAVA中如何创建和销毁对象

    第1条 考虑用静态方法代替构造器 类可以通过静态工厂方法来提供它的客户端,而不是通过构造器.提供静态工厂方法而不是公有构造器,这样做具有几大优势. 1.静态工厂方法与构造器不同的第一大优势在于,它们有 ...

最新文章

  1. python[外星人入侵] 项目
  2. 定义一个DOG类(Java)
  3. linux ln 权限不够,每次执行./都会出现权限不够,已经是root了 已解决!
  4. VS.NET中的生成解决方案和重新生成解决方案有什么区别?
  5. 题解 UVA10298 【Power Strings】
  6. C++之抽象基类与纯虚函数
  7. 全新 Win 9 概念 界面漂亮极了
  8. aws java mysql_java - AWS EC2 / MySql - spring boot无法从datasource确定jdbc url - 堆栈内存溢出...
  9. Node.js webpack webpack-dev-server
  10. swift-01-利用元组判断字符串出现次数
  11. BCS冬奥主题活动日:奥运网络安全成全球关注焦点
  12. hdu 1421 搬寝室
  13. html语言汇总,第三讲HTML语言全面介绍汇总.ppt
  14. 如何选择InstallShield工程类型
  15. 【概率论】高斯分布、中心极限定理、伯努利分布、二项分布
  16. 【先锋】七牛云存储:三年磨一剑及背后核心技术解析
  17. linux hba卡超时时间,如何设置Emulex HBA 卡超时参数
  18. 在外部JS中使用validity进行表单验证出现未定义问题
  19. 刷机前忘记退出Google账号解决方案
  20. 养生之道——》早上刷牙干呕&&慢性烟炎

热门文章

  1. 合肥工业大学计算机与信息学院罗徇,合肥工业大学计算机与信息学院导师介绍:吴共庆...
  2. python 实现对地图的点击_利用python和百度地图API实现数据地图标注的方法
  3. ESP8266-Arduino编程实例-OLED显示电容式土壤湿度传感器数据
  4. java thrift_Thrift入门及Java实例演示【转】
  5. 如何避免“中间人”攻击
  6. 中小河流雨水情监测_水文监测预警系统
  7. 一种实现PC端影音收录的方法 (4test)
  8. TMS320F28xx SPI master/slave example
  9. 访问学者出国申请可以分为哪几类?
  10. LINUX These critical programs are missing or too old: bison compiler python