前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >#TW好文集锦# 代码之丑--多个构造函数

#TW好文集锦# 代码之丑--多个构造函数

作者头像
ThoughtWorks
发布2018-04-20 16:05:50
7300
发布2018-04-20 16:05:50
举报
文章被收录于专栏:ThoughtWorks

代码之丑(十四)--多个构造函数

文/郑晔

代码评审,我对一个TreeSet产生了兴趣。

代码语言:javascript
复制
TreeSet<String> configuration = new TreeSet<string>(); ... Handler handler = new Handler(configuration); </string>

“为什么要用TreeSet呢?”,我问道。

“因为这是构造函数的参数决定的。”,有人回答。

“可以打开源码看一下吗?”,对于这种处理,通常人们都会选择HashSet,好奇心驱使我要进一步专研一下这段代码。

我看到了这个构造函数的声明:

代码语言:javascript
复制
public Handler(TreeSet<String> configuration) {
  ...
}

在我开始研究这个构造函数使用TreeSet的缘由之前,我看到了另外一个构造函数,或许它更能满足我的心理需求:

代码语言:javascript
复制
public Handler(HashSet<String> configuration) {
  ...
}

“为什么会有一个用到HashSet构造函数?它和用到TreeSet的有什么不同”,我继续追问。

“它们是分别处理两种情况的,在不同的配置下起作用。”

我终于知道为什么会有TreeSet,因为HashSet已经被人用了,为了支持另外一种情形,TreeSet被人从墙角了挖了出来。可是如果不深究代码,谁又能知道这其中的奥妙呢?显然,我们需要一个更具表达力的写法。

之所以陷入这样的坑,根源在于构造函数,因为构造函数只能有一个名字。其实,这里只是要解决构造的问题,而面对这个问题,解决方式几乎再直白不过了:工厂方法。

代码语言:javascript
复制
class HandlerFactory {
  public static Handler createTrivialHandler(Set<String> configuration) {
    ...
  }

  public static Handler createFancyHandler(Set<String> configuration) {
    ...
  }
}

这里,用两个名字上有更明确意义的函数替代之前的那两个需要强大理解力的构造函数。当然,这里的参数用了Set,连具体的类型都省了,真正的面向接口编程。

事实上,如果一个类有多于一个的构造函数,都是值得考虑的。我曾写过一篇《构造函数沉思录》专门讨论这个问题。

作者简介

郑晔

ThoughtWorks公司首席咨询师,拥有十多年企业级软件开发经验,热衷于探索各种程序设计语言在真实软件开发中所能发挥的威力,致力于探寻合理的软件开发方式,加入ThoughtWorks公司后,投入到敏捷开发方法的实践之中,为其他公司提供敏捷开发方法方面的咨询服务。他的blog是梦想风暴,其微博是@dreamhead。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2013-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 思特沃克 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码之丑(十四)--多个构造函数
    • 作者简介
    相关产品与服务
    项目管理
    CODING 项目管理(CODING Project Management,CODING-PM)工具包含迭代管理、需求管理、任务管理、缺陷管理、文件/wiki 等功能,适用于研发团队进行项目管理或敏捷开发实践。结合敏捷研发理念,帮助您对产品进行迭代规划,让每个迭代中的需求、任务、缺陷无障碍沟通流转, 让项目开发过程风险可控,达到可持续性快速迭代。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档