`

第2条:遇到多个构造器参数时要考虑用构建器

阅读更多
当创建对象需要传入多个参数的时候我们通常会根据参数的数量写不同的构造器,具体如下

public A(int a){}
public A(int a, int b){}
public A(int a, int b, int c){}


根据不同的参数调用不同的构造器,但是当参数多了的时候,这种方式不够灵活,所以会实现动态传参的方法

public A(){}
public void seta(int a){}
public void setb(int b){}
public void setc(int c){}


这种方式提高了传参的可读性,也提高了传参的灵活性,但是会增加代码行数,同时在多线程异步执行的时候导致奇怪的错误。

有没有办法解决呢?既能提高代码可读性,提高参数灵活性,又不会增加代码行数,并保证线程安全呢?
构建器模式登场,先看代码:
public class A {
    private int a;
    private int b;
    private int c;

    public static class Builder {
        private int a;
        private int b;
        private int c;
        public Builder(){}
        public Builder seta(int a) { this.a = a; return this} 
        public Builder setb(int b) { this.b = b; return this}
        public Builder setc(int c) { this.c = c; return this}
        public A build() { return new A(this)}
    }

    private A(Builder builder) {
        this.a = builder.a;
        this.b = builder.b;
        this.c = builder.c;
    }
}

调用构造方法:
A a = new A.Builder().seta(1).setb(2).setc(3).build();


这样就解决了以上所说的问题,但是他的缺点同样也是存在的,就是:
1.构造器写起来很复杂
2.创建对象开销比较大
所以构建器模式只适用于需要传入很多种情况参数的时候,比如大于4种参数的配合,才比较划算。
而且值得注意的是:最好在类的设计之初就考虑是否使用构建器,否则日后扩展起来新构建器旧构造器一起用维护起来不方便。
分享到:
评论

相关推荐

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    第2章 生成、打包、部署和管理应用程序及类型 2.1 .NET Framework部署目标 2.2 将类型生成到模块中 2.2.1 响应文件 2.3 元数据概述 2.4 将模块合并成程序集 2.4.1 使用Visual Studio IDE将程序集添加到项目中...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    7.3.3 让方法有多个参数 163 7.4 返回值:汽车超速了吗? 164 7.4.1 写一个有返回值的方法 164 7.4.2 调用有返回值的方法 165 7.4.3 发生了什么?如何使用方法的返回值? 166 7.4.4 使用return结束方法 166 ...

    Spring面试题

    在对由三部分组成的 Spring 系列 的第 1 部分进行总结时,我使用了一个示例,演示了如何通过 Spring IOC 容器注入应用程序的依赖关系(而不是将它们构建进来)。 我用开启在线信用帐户的用例作为起点。对于该实现,...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    7.3.3 让方法有多个参数 163 7.4 返回值:汽车超速了吗? 164 7.4.1 写一个有返回值的方法 164 7.4.2 调用有返回值的方法 165 7.4.3 发生了什么?如何使用方法的返回值? 166 7.4.4 使用return结束方法 166 ...

    LuaBind 源码 (Lua增强库)

    resume_fucntion()调用的返回值是 lua_yield()的第一个传入参数.当你想要继续一个 协程的时候,你只需要调用 resume() 在你的 lua_State() 上,因为它已经在执行一个函数 (即先前出入的入口函数),所以你不需要再次传入...

    超级有影响力霸气的Java面试题大全文档

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

    effectiveJava:有效的java se 书中的例子

    第 2 条:当面临许多构造函数参数时考虑构建器 伸缩构造函数模式有效,但是当参数很多时很难编写客户端代码,而且更难阅读 Builder 模式模拟命名的可选参数 Class.newInstance 破坏编译时异常检查 在设计具有构造...

    【05-面向对象(下)】

    我们把该类的构造器使用Private修饰,从而把该 类的所有构造器隐藏起来。  –2.则需要提供一个public方法作为该类的访问点,用于创建该类的对象,且必须使用static修饰  –3.该类还必须缓存已经创建的对象,必须...

    construct:Java版本的“构造”是一个python库,用于解析和构建数据结构(二进制或文本)

    构造具有位和字节的粒度,对称操作(解析和构建),面向组件的声明性设计,易于调试和测试,易于扩展的子类系统以及许多原始数据使您的工作更轻松的结构: 领域结构工会中继器元构造开关按需解析指针和更多!...

    C#5.0本质论第四版(因文件较大传的是百度网盘地址)

    5.7.5 构造器链:使用this调用另一个构造器 168 5.8 静态成员 172 5.8.1 静态字段 172 5.8.2 静态方法 174 5.8.3 静态构造器 175 5.8.4 静态属性 176 5.8.5 静态类 177 5.9 扩展方法 ...

    java 面试题 总结

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

    CLR.via.C#.(中文第3版)(自制详细书签)

    第2章 生成、打包、部署和管理应用程序及类型 2.1 .NET Framework部署目标 2.2 将类型生成到模块中 2.2.1 响应文件 2.3 元数据概述 2.4 将模块合并成程序集 2.4.1 使用Visual Studio IDE将程序集添加到项目中 ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    第2章 生成、打包、部署和管理应用程序及类型 2.1 .NET Framework部署目标 2.2 将类型生成到模块中 2.2.1 响应文件 2.3 元数据概述 2.4 将模块合并成程序集 2.4.1 使用Visual Studio IDE将程序集添加到项目中...

    3D游戏卷2:动画与高级实时渲染技术——1

    第2章 高级游戏系统剖析Ⅱ:实时处理 2.1 视见和BSP 2.1.1 生成视见约束体的面 2.1.2 远近裁剪面和视见约束体 2.2 照相机控制 2.3 使用BSP的基本碰撞检测和反弹 2.3.1 碰撞和BSP遍历 2.3.2 粒子,场景检测和反弹 2.4...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    第2章 生成、打包、部署和管理应用程序及类型 2.1 .NET Framework部署目标 2.2 将类型生成到模块中 2.2.1 响应文件 2.3 元数据概述 2.4 将模块合并成程序集 2.4.1 使用Visual Studio IDE将程序集添加到项目中...

    python cookbook(第3版)

    8.16 在类中定义多个构造器 8.17 创建不调用init方法的实例 8.18 利用Mixins扩展类功能 8.19 实现状态对象或者状态机 8.20 通过字符串调用对象方法 8.21 实现访问者模式 8.22 不用递归实现访问者模式 8.23 ...

    JAVA面试题最全集

    一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握内部类和接口的概念 54.StringTokenizer类的使用 55.数据结构,如何遍历List中的元素? 如果要按照键值保存或者访问数据,使用什么数据结构? ...

    C#本质论(第3版)

    5.7.5 使用this调用另一个构造器 5.8 静态成员 5.8.1 静态字段 5.8.2 静态方法 5.8.3 静态构造器 5.8.4 静态属性 5.8.5 静态类 5.9 扩展方法 5.10 封装数据 5.10.1 const 5.10.2 readonly 5.11 嵌套类 ...

    3D游戏卷2:动画与高级实时渲染技术——2

    第2章 高级游戏系统剖析Ⅱ:实时处理 2.1 视见和BSP 2.1.1 生成视见约束体的面 2.1.2 远近裁剪面和视见约束体 2.2 照相机控制 2.3 使用BSP的基本碰撞检测和反弹 2.3.1 碰撞和BSP遍历 2.3.2 粒子,场景检测和反弹 2.4...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    第2章 使用变量、操作符和表达式 25 2.1 理解语句 25 2.2 使用标识符 26 2.3 使用变量 27 2.3.1 命名变量 27 2.3.2 声明变量 28 2.4 使用基本数据类型 28 2.4.1 未赋值的局部变量 29 2.4.2 显示基本数据类型...

Global site tag (gtag.js) - Google Analytics