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

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. J2EE的13个规范之JDBC

    假设让你接触一样新的东西.你可能感觉无所适从,可是假设本来就是旧事物的话,你学习起来还难吗? 一.ODBC,我们的老朋友 ODBC(Open Database Connectivity)是微软公司与数 ...

  2. 辛星一起了解下后续PHP性能功能

    关于第一个发言,这篇文章是我的原创.但,这些数据不被总结出来我,你可以搜索下"百度project师HDK",这些数据提供了他,我只是给一个总结.因为他很长的文章,我在这里提炼几点. ...

  3. C++转让Lua

    转载请注明出处:http://blog.csdn.net/zhy_cheng/article/details/39756423 我使用的cocos2d-x版本号是2.3.3.先在一个C++projec ...

  4. Robotium原则的实施源代码分析

    从前面的章节<Robotium源代码分析之Instrumentation进阶>中我们了解到了Robotium所基于的Instrumentation的一些进阶基础.比方它注入事件的原理等,但 ...

  5. Java乔晓松-android中调用系统拍照功能并显示拍照的图片

    android中调用系统拍照功能并显示拍照的图片 如果你是拍照完,利用onActivityResult获取data数据,把data数据转换成Bitmap数据,这样获取到的图片,是拍照的照片的缩略图 代 ...

  6. ORA-00600 [kollasg:client-side tmp lob]

    今天在查看一个库的日志时,发现被ORA-00600 [kollasg:client-side tmp lob] 错误刷屏了. 发生该错误的原因是由于应用那边lob的问题.lob没有被初始化,建议使用E ...

  7. 主攻ASP.NET MVC4.0之重生:ASP.NET MVC使用JSONP

    原文:主攻ASP.NET MVC4.0之重生:ASP.NET MVC使用JSONP 原文地址 http://www.codeguru.com/csharp/.net/net_asp/using-jso ...

  8. Shrio登陆验证实例详细解读(转)

    摘要:本文采用了Spring+SpringMVC+Mybatis+Shiro+Msql来写了一个登陆验证的实例,下面来看看过程吧!整个工程基于Mavevn来创建,运行环境为JDK1.6+WIN7+to ...

  9. C++学习笔记9-运算符重载

    1. 重载运营商必须有一个类类型的操作数 对于内置类型运营商.它的意义不能改变. 例如,内置整数加法运算不能被重新定义: // error: cannotredefine built-in opera ...

  10. LCA 学习算法 (最近的共同祖先)poj 1330

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20983   Accept ...