- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
构造模式实践Java开发Java经验技巧.doc
构造模式实践-编程开发技术
构造模式实践
木文由ImportNew?孟冰川翻译自jlordialeso欢迎加入翻译小组。转载请见文末要求。
这是我第一篇文章(也是我关于这个主题的第一篇博客)。我记不清在哪读过这 项内容(尽管我基本上确认是在Practices of an Agile Developer Jt看到的), 但是写博客应该能帮助你金神贯注。具体点来说,通过花些时间来解释你所知道 的东西,你能更好的理解它。
这也正是我想耍努力去做的,通过解释一件事,继而进一步理解这件事。并且还 有个额外的好处,当我冋忆曾经做过的事情时,它是一个很好的集中地。希望在 这过程小也能帮助到你们。
废话不多,让我们直奔主题——构造模式。我不打算分割成许多细节来讲,因为 已经有非常多的稿件,书籍详细的说明过这个模式。反而,我会告诉你为什么, 以及什么吋候应该考虑使用它。然而,值得一提的是,这里所说的模式和四人帮 书中的模式冇些不同。尽管原始的模式聚焦于抽象出构建的步骤,这样通过改变 建造者的实现就可以得到不同的结果,本篇所说的模式着眼丁从多构造器,多可 选参数以及过度使用的setter中移除不必要的复杂性。
想彖下你有一个类,像下图所示有许多属性。假设你想让你的类不可变(顺便说 一下,除非有一个好的理由不这样做,否则你应该坚持。但是我们会以另--种方 式來达到要求。)
public class User {
private final String firstName; //required
private final String lastName; //required
private final int age; //optional
private finalString phone;//optional
private final
String phone;
//optional
//optionalprivate final String address;
//optional
现在,想象下你的类中冇些属性是必须的,冇些则是可选的。你将要如何创建你 的对象?所冇的属性都声明为final,所以你必须在构造器中给它们全部赋值, 但是你也想给这个类的客户端忽略可选展性的机会。
第一个可行的选择是拥冇一个只接受必要屈性作为参数的构造器,还要一个构造 器接受所有的必要属性以及第一个可选属性,再有一个构造器接受两个可选属性 等等。它是什么样子呢?像下面这个样子:
public User (String firstName, String lastName)
this (firstName, lastName, 0);
public User(String firstName, String lastName, int age) {
this(firstName, lastName, age, 〃“);
}
public User(String firstName, String lastName, int age, String phone) { this(firstName, lastName, age, phone, 〃“);
}
public User(String firstName, String lastName, int age, String phone, String address) {
this. firstName 二 firstName;
thi s. lastName = lastName;
this. age 二 age;
this, phone = phone;
this, address = address;
}
这种方式來构建类的实例的好处是它能很好的工作。然而,这种方式的问题也很 明显。当你只有几个属性时还好,但是当这个数字扩大时,代码就变的难以理解 和维护了。
更重要的是,代码对客户端来说变的很难。客户端应该调用哪个构造器?有两个 参数的?有三个参数的?那些不用传确切值的参数的默认值是多少?如果我想 给地址赋值,但是不给age和phone赋值要怎么办?那种情况下,我就不得不调 用接受所有参数的构造器,并且给那些不需要的传入不在乎的默认值。此外,几 个类型相同的参数是很令人费解的。第一个String是电话述是地址?那么在这 些情况下,我们还有其他选择吗?我们可以依照JavaBeans的约定,一个无参构 造并且每个参数提供-个get和set。类似下面这个:
public class User {
private String firstName; // required
private String lastName; // required
private int age; // optional
priv
文档评论(0)