【AICon】 如何构建高效的 RAG 系统?RAG 技术在实际应用中遇到的挑战及应对策略?>>> 了解详情
写点什么

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

  • 2012-07-04
  • 本文字数:1002 字

    阅读完需:约 3 分钟

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

作者简介

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

查看原文:代码之丑(十四)


感谢张凯峰对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012-07-04 00:004295
用户头像

发布了 22 篇内容, 共 13.5 次阅读, 收获喜欢 49 次。

关注

评论

发布
暂无评论
发现更多内容

第十二周 作业

简简单单

我看JAVA 之 Class

awen

Java 源码 jdk class

我看JAVA 之 枚举类型

awen

Java 源码 jdk 枚举

Linux入门篇 —— Linux 用户与组管理详解(system-config-users && 命令行)

若尘

Linux 命令行 用户

涨薪50%,从小厂逆袭快手 - 附面经

haxianhe

面试

我看JAVA 之 Thread & ThreadLocal

awen

Java 源码 多线程

如何学习一项技能

不在调上

推荐程序员平时使用最多的绘图软件!!!

秦怀杂货店

软件 流程图 绘图

《经济学人》2021年2月27日刊精彩文章导读及资源下载

wbliu85

第十二周 学习总结

简简单单

观点 | 破解云管理平台在数据中心管理体系中定位模糊的困局

BoCloud博云

云计算 PaaS 服务目录 多云管理平台 数据中心管理

万绿丛中一点红——雷斯多夫效应

Justin

心理学 交互设计 28天写作 游戏设计

记忆这件“小事”「Day 7」

道伟

心理学 28天写作

我看JAVA 之 Annotation

awen

Java 源码 jdk 注解 annotation

Enterprise Tech30(2021)

行人23

Tech ET30

优雅地停止Spring Boot应用

韩斌

写给 Go 初学者的指北

Rayjun

Go 语言

LiteOS:SpinLock自旋锁及LockDep死锁检测

华为云开发者联盟

死锁 LiteOS 自旋锁 SpinLock LockDep

智能客服+智能助手,这波“数字员工”的业务能力太强了!

华为云开发者联盟

华为 AI 数字 智能客服 智能助手

探索图神经网络的网络架构和训练方法

华为云开发者联盟

神经网络 AI 图神经网络 网络架构 GNNs

深入解读华为云细粒度文本情感分析及其应用

华为云开发者联盟

AI 华为云 情感分析 语言语义 文本情感分析

2021突击金三银四必备:BAT1000Java面试真题合集!

比伯

Java 编程 架构 面试 计算机

GitHub上连夜被下架!阿里巴巴2021版JDK源码笔记(2月第三版)

Java架构追梦

Java 阿里巴巴 面试 jdk源码 金三银四

(28DW-S8-Day7) 比特币原始文献略读

mtfelix

比特币 区块链 白皮书 28天写作 工作量证明

从萧何进入咸阳丞相府到数字化时代的决策

数列科技杨德华

28天写作

前端170面试题+答案学习整理(良心制作)

我是哪吒

程序员 面试 大前端 28天写作 2月春节不断更

Linux常见IO分析工具

运维研习社

我看JAVA 之 基本数据类型与封装类型

awen

Java 源码 基本数据类型

多年阅读《经济学人》是一种什么体验?

wbliu85

双指针高频面试题:「三数之和」的姐妹篇 ...

宫水三叶的刷题日记

面试 LeetCode 数据结构与算法

如何探索自己的职业价值观,让工作更有动力

一笑

28天写作

代码之丑(十四)--多个构造函数_Java_郑晔_InfoQ精选文章