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

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. android 如何分析java.lang.IllegalArgumentException: Cannot draw recycled bitmaps异常

    这类问题的分析,通常你需要找到bitmap对象已经在那个位置recyle,然后检查代码. 如何定位的位置,其中代码具有对bitmap 目的recyle.能够 Bitmap.java的recycle方法 ...

  2. JavaScript动态更改页面元素

    通过JavaScript动态变化HTML元素 至HTML加元 首先需要创建一个标签,然后添加到标签中的相应的内容.然后创建添加到相应的位置好标签. <!DOCTYPE html PUBLIC & ...

  3. java中间==、equals和hashCode差额

    java于==.equals().hashCode()和比较两个对象. 关于== ==是easy理解的.java设计java就是要比較两个对象是不是同一个对象. 对于引用变量而言.比較的时候两个引用变 ...

  4. JSP+Ajax站点开发小知识

    一.JSP基础 1.<select  name="love"  size="3">当中的size属性指定了列表框显示选项的条数.假设全部选项多于这个 ...

  5. OCP解决问题053-16 MEMORY_TARGET

    16.Setting which of the following initialization parameters enables Automatic Memory Management? A. ...

  6. RH033读书笔记(3)-Lab 4 Browsing the Filesystem

    Lab 4 Browsing the Filesystem Sequence 1: Directory and File Organization 1. Log in as user student ...

  7. OllyDbg 使用注意事项 (十)

    OllyDbg 用笔记 (十) 參考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 演示样例程序下载地址:http://pan.baidu.com/s/1kT1ce83 这个程序能够从 ...

  8. atitit..主流 浏览器 js 发动机 内核 市场份额 attialx总结vOa9

    atitit..主流 浏览器 js 发动机  内核 市场份额 attialx总结vOa9 1. 浏览器内核 1 2. 浏览器的主要组件包含: 2 2.1. 主要组件体系结构 2 2.2. WebCor ...

  9. C# HttpClient Cookie验证解决方法

    自实现的cookie 验证,远程取值的例子 以下代码配合HttpClient使用可以实现跨域(cookie的读写) //验证 复制代码 代码如下: HttpClient httpClient = ne ...

  10. 【iOS】UIViewController生命周期

    UIViewController有2周期: 在UIViewController中,View存在两个循环:载入循环和卸载循环. 载入循环 1>程序请求controller的view. 2>假 ...