在《Effective Java 第2版》中有提到,遇到多个构造器参数时要考虑使用构建器(Builder模式)。相比于重叠构造器(telescoping constructor)模式和JavaBeans模式,Builder模式实现的对象更利于使用。

  1. 重叠构造器需要写众多的构造方法, 对于使用者来说, 也需要辨识每个构造方法传入的参数是什么

Person person = new Person();
person.setId(1);
person.setName("李四");
person.setAge(20);
person.setSex("男");
person.setPhone("18800000000");
person.setAddress("China");
person.setDesc("测试使用JavaBeans模式");

遗憾的是,JavaBeans模式自身有着很重要的缺点。因为构造过程被分到了几个调用中,在构造过程中JavaBean可能处于不一致的状态(考虑多线程环境下,构造对象的线程只运行到了 person.setAge(20); , 然后另一个线程就试图去使用 person 对象 , 虽然这时候person对象不为空,但是这个对象的状态并不是最终态)。类无法仅仅通过检验构造器参数的有效性来保证一致性。

  1. 而Builder模式就能保证一个对象如果创建了 , 那么就肯定是稳定态,因为他保证了构造对象的原子性。

Builder模式到底好在哪里相关推荐

  1. 设计模式系列-Builder模式(高效构建参数)

    引言 在Java编程中,常常需要为一个Bean构建成员变量或者构建参数,常用的方法有使用构造函数.使用JavaBean的set()方法,但是这两个方案或多或少都存在一定的缺点,于是今天的主角build ...

  2. 设计模式-到底什么是builder模式

    我们来看一个一些常见的开源代码中带builder字样的经典类: (jdk)Stringbuilder (spring)springApplicationBuilder (es)xxxQuerybuli ...

  3. 被吹上天的802.11ac Wave2到底好在哪?还有,Wave1哪去了?

    802.11ac Wave2到底好在哪? 在说Wave2之前,我们先要了解802.11ac是什么,它的特点是什么.IEEE 802.11ac是802.11的一个通信标准,802.11n的升级版.再具体 ...

  4. iPhone到底好在哪里

    iPhone到底好在哪里 在成功的卖出1亿部"21世纪最伟大的电子产品"--iPod后,6月29日,数字教父乔布斯带着他最新一款"改变世界"的产品iPhone& ...

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

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

  6. 码农小汪-设计模式之-Builder模式

    建造者模式 将一个复杂的对象的构建与它的表示分离,使得同样构建的过程中可以创建不同的表示.这个话语看起来,好累啊!真心很难理解. 下面是它的UML图: 抽象建造者角色(Builder):为创建一个Pr ...

  7. Roam Reserach 到底好在哪儿?

    题图:Photo by João Silas on Unsplash 说 Roam Research 是一款笔记应用,可能是低估它了. 疑惑 最近,我看到了一个奇怪的现象. Roam Research ...

  8. 同事写了一个疯狂的类构造器,我要疯了,Builder 模式都不会么?!!

    疯狂的类构造器 最近栈长在做 Code Review 时,发现一段创建对象的方法: Task task = new Task(112, "紧急任务", "处理一下这个任务 ...

  9. Java 常用设计模式 -- Builder模式

    Builder模式是在Java中最流行的模式之一.它很简单,有助于保持对象不可变,并且可以使用Project Lombok的@Builder或Immutables等工具生成,仅举几例. 模式的流畅变体 ...

最新文章

  1. otto android,Albert otto
  2. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 )
  3. EasyRTSPClient:基于live555封装的支持重连的RTSP客户端RTSPClient
  4. return 返回值的问题
  5. Scrapy Learning笔记(四)- Scrapy双向爬取
  6. linux 脚本 DIST,shell 脚本判断linux 的发行版本
  7. 深入浅出WPF之我件2
  8. 视频相似度检测算法软件,视频相似度检测算法图
  9. 89600 matlab,【图片】使用Matlab分析频谱仪I/Q数据【matlab吧】_百度贴吧
  10. 一般进入服务器系统的密码,如何查看远程服务器的密码是什么
  11. python代码画人物_用Python+Gephi画《人民的名义》人物关系图
  12. 倾斜摄影原理与关键技术介绍
  13. 支付宝基金自选管理系统Springboot + Vue 实现
  14. oracle中begin end的作用,如何在SQL * Plus中使用begin/end运行Oracle查询?
  15. “死”法不重样,一根数据线如何从“机器伴侣”变身电脑杀手?
  16. 中国数字商业核心产业链分布
  17. 【优化理论与方法】线性规划的基本定理
  18. windows 远程桌面无法连接的问题
  19. 并行接口电路8255A的基本使用——三种工作方式的时序图的具体讲解
  20. 浙大版《C语言程序设计实验与习题指导(第4版)》题目集 实验2-3-2 计算摄氏温度

热门文章

  1. 【干货】五个免费下载PPT模板的网站,你一定会用到的
  2. python毕业设计作品基于django框架个人博客系统毕设成品(6)开题答辩PPT
  3. 基于MATLAB的中继系统在瑞利信道下的误码率仿真分析
  4. 计算机科学与技术杂谈
  5. ESP8266-NodeMCU (1) 开发板介绍
  6. 机器学习预测的概率如何表示?
  7. 智能机器人-(一)常用传感器及其原理
  8. L2-038 病毒溯源 (25 分)
  9. 删除下拉框只找23火星软件_下拉框关键词软件只找23火星下拉框词工具佳选火星...
  10. dll放在unity哪个文件夹下_Unity中调用DLL库