静态工厂和构造具有共同的局限性:我们不能扩展到大量的非常好的可选参数。

1、对于多个可选參数的构造器。我们都习惯採用重叠构造器模式。比方一个參数的构造器调用2个參数的构造器。
    2个參数的构造器调用3个參数的,以此类推。
public class User{

    private int id。
    private String name。
    private String age。
    private String sex。
    
    public User(int id){
        this(id,null);
    }

     public User(int id,String name){
        this(id,name,null);
    }
     public User(int id,String name,String age){
        this(id,name,age,null);
    }

}

当參数足够多的时候,这样的就重叠调用模式就非常难编写。而且非常难阅读。


2、 取代方法。使用javaBean模式。仅仅要调用一个无參构造器创建对象,然后调用setter方法设置每一个必要的參数


public class User{

    private int id。
    private String name;
    private String age;
    private String sex。
    
  public User() {}
    //setters
    public void setId (int value){ id= value;}
    public void setName (String value){ name= value;}

    public void setAge (String value){ age= value;}
    public void setSex (String value){ sex= value;}

}

这个javaBean模式弥补了重叠构造器繁琐的调用的。可是。遗憾的是javaBean自身有严重的缺点:由于构造过程被分到
几个构造project中的javaBean可能是不一致的状态,也就是没法保证线程安全性。


3、 第三种取代方式,既能像重叠构造器那样的安全性。也能够有javaBean那样的可读性。那就是使用Builder模式。

public class User{

    private int id;
    private String name。
    private String age。
    private String sex;
    
  public User(Builder builder) {
            id= builder.id;
            name=builder.name;
            age=builder.age;
            sex=builder.sex;
    }
   
    
    public Builder(int id){
        this.id=id;
    }
    
     public Builder   setName(String val){
        this.name=val;
        return this;
    }
     public Builder   setAge(String val){
        this.age=val;
        return this;
    }
     public Builder   setSex(String val){
        this.sex=val;
        return this;
    }

    
}

总之,假设构造器或者静态工厂中具有非常多參数,使用builder模式是不错的选择。



















版权声明:本文博客原创文章。博客,未经同意,不得转载。

【代码优化】当许多构造函数的参数,请考虑使用builder模式的更多相关文章

  1. Effective Java 第三版——2. 当构造方法参数过多时使用builder模式

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  2. 当构造方法参数过多时使用builder模式

    静态工厂和构造方法都有一个限制:它们不能很好地扩展到很多可选参数的情景.请考虑一个代表包装食品上的营养成分标签的例子.这些标签有几个必需的属性——每次建议的摄入量,每罐的份量和每份卡路里 ,以及超过 ...

  3. 02.当构造参数过多时使用builder模式

    前言 <Effective Java>中文第三版,是一本关于Java基础的书,这本书不止一次有人推荐我看.其中包括我很喜欢的博客园博主五月的仓颉,他曾在自己的博文<给Java程序猿们 ...

  4. PHP动态实例化对象并向构造函数传递参数

    在框架开发,模块化开发等场合,我们可能有一种需求,那就是在PHP运行时动态实例化对象. 什么是动态实例化对象呢?我们先来看一下PHP有一种变量函数(可变函数)的概念,例如如下代码: function ...

  5. 利用T4模板生成ASP.NET Core控制器的构造函数和参数

    前言 在ASP.NET Core中引入了DI,并且通过构造函数注入参数,控制器中会大量使用DI注入各种的配置参数,如果配置注入的参数比较多,而且各个控制器需要的配置参数都基本一样的话,那么不断重复的复 ...

  6. [C++参考]拷贝构造函数的参数必须是引用类型

    在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识.在effective C++中说过这么一点:拷贝构造函数的参数必须是引用类型的.但是为什么呢? ...

  7. [转]为什么复制构造函数的参数需要加const和引用

    [转]为什么复制构造函数的参数需要加const和引用 一.引言 1.0在解答这个问题之前,我们先跑个小程序,看下调用关系. #include <iostream> using namesp ...

  8. Java中构造函数传参数在基本数据类型和引用类型之间的区别

    Java中构造函数传参数在基本数据类型和引用类型的区别 如果构造函数中穿的参数为基本数据类型,如果在函数中没有返回值,在调用的时候不会发生改变:而如果是引用类型,改变的是存储的位置,所有不管有没有返回 ...

  9. __destruct()析构函数的执行时刻 __construct()构造函数传入参数 构造函数与后台登录安全

    <?php class test_construct_avg { function __construct($input = '') { $this->input = $input; } ...

随机推荐

  1. Spring官方网站的改版后下载

    Spring官方网站改版很长一段时间后还没有找到直接下载Jar链接包,下面总结了一些方法,可在网上,亲測可用. 1.直接输入地址,改对应版本号就可以:http://repo.springsource. ...

  2. 索尼 LT26I刷机包 X.I.D 增加官方风格 GF A3.9.4 各方面完美

    ROM介 FX_GF_A系列是具有官方风格的.稳定的.流畅的.省电的.新功能体验的.最悦耳音效体验的ROM. FX_GF_A更新日志 ☆ GF_3.9.4 更新信息 ☆ 更新播放器 ☆ 更新adsp数 ...

  3. Ubuntu 设备 spark

    周围环境: Unbunt 12.04 Hadoop 2.2.x Sprak 0.9 Scala scala-2.9.0.final.tgz 一步 1. 下载 scala 2. 解压scala,然后改动 ...

  4. 1pdf

    Document doc = new Document(new iTextSharp.text.Rectangle(564, 351));  PdfWriter writer= PdfWriter.G ...

  5. [windows phone] 教你如何使地图动画缩放

    原文:[windows phone] 教你如何使地图动画缩放 说明 本篇将介绍如何将地图以动画显示呈现,在以下的范例介绍中可以看到有动画跟没动画的差别,如果你的地图还是很单调的话,不仿加上这个设计,让 ...

  6. ContentProvider的使用

    这方面的资料应该网上已经很多了,我在这里只是做简单的总结就行了. 如题:ContentProvider是android的内容提供器,可以为应用程序提供各种的数据,例如数据表,txt文件,xml文件等等 ...

  7. 谷歌技术面试要点(Google面试)(14年5月20日交大专场)

    技术面试的主题 1.简要自我介绍: 姓名.学校.专业 做过的项目与实习 个人主要成就 2.技术评估: 构建与开发算法 编程 计算机基础知识 数据结构 现实世界问题解决能力 设计问题(主要针对博士生) ...

  8. js你真的了解offsetWidth吗

    offsetWidth是什么? 答:它可以获取物体宽度的数值 那么就只是这样吗! html部分 <div id="div1"></div> <styl ...

  9. JDK5什么是新的线程锁技术(两)

    一个. Lock线程同步实现互斥 Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也是一个对象. 两个线程运行的代码片段要实现同步相互排斥的效果.他们必须用 ...

  10. Android-Service组件

    转载请标明出处:http://blog.csdn.net/goldenfish1919/article/details/40381109 原文:http://developer.android.com ...