前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Effective Java 第二版 学习笔记(2) 创建和销毁对象-多个构造器参数时考虑构建器

Effective Java 第二版 学习笔记(2) 创建和销毁对象-多个构造器参数时考虑构建器

作者头像
发布2019-01-07 13:00:14
5870
发布2019-01-07 13:00:14
举报
文章被收录于专栏:WD学习记录WD学习记录

参考:Effective Java 第二版 第二章

静态工厂和构造器有个共同的局限,都能很好地扩展到大量的可选参数。

重叠构造器模式可行,但是当有许多参数时,客户端代码会很难编写,并且难以阅读。也可以用JavaBeans莫斯。这种模式中,调用一个无参构造器来创建对象,然后调用setter方法来设置每个必要的参数,以及每个相关的可选参数。但是,JavaBeans莫斯的缺点在于构造过程被分到了几个调用中,在构造过程中,JavaBean可能处于不一致的状态。同时JavaBeans模式阻止了把类做成不可变的可能。需要程序员付出额外的努力来确保它的线程安全。

还有一种方式是Builder模式,不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或者静态工厂),得到一个builder对象。然后客户端在builder对象上调用类似于setter的方法,来设置每个相关的可选参数。最后客户端调用无参的build方法来生成不可变的对象。这个builder是塔构建的类的静态成员类。

所有的默认参数值都单独放在一个地方。builder的setter方法返回builder本身,以便可以把调用链连接起来。

这样的客户端代码很容易编写,更为重要的是,易于阅读。builder模式模拟了具名的可选参数。

builder像个构造器一样,可以对其参数强加约束条件。builder方法可以检验这些约束条件。将参数从builder拷贝到对象之中后,并在对象域而不是builder域中对它们进行检验,这一点很重要。

与构造器相比,builder的略微优势在于,builder可以有多个可变参数。构造器就像方法一样,只能有一个可变参数。因为builder利用单独的方法来设置每个参数。

Builder模式十分灵活,可以利用单个builder构建多个对象。builder的参数可以在创建对象期间进行调整,也可以随着不同的对象而改变。builder可以自动填充某些域。

Builder模式自身的不足在于,为了创建对象,必须先创建它的构建器。虽然创建构建器的开销在实践中可能不那么明显,但是在某些十分注重性能的情况下,可能就成问题了。Builder模式比重叠构造器模式更加冗长,因此,它只在有很多参数的情况下使用。

如果类的构造器或者静态工厂中有多个参数,设计这种类时Builder模式就是种不错的选择。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年12月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档