想想几天前的天气,阳光明媚,万里无云,真是让人有辞职的冲动。到了这个小假期,似乎人间的幽怨又郁积起来,天地转入混沌,一篇迷茫。我决定窝在家里,学点东西。
这个话题对于程序员来说是家常便饭,设计许多函数、方法的时候都会遇到。实际上这是极其基本、极其容易理解的一个问题,不过有些人还没有意识到,仍然随意乱写。拿 Java 举个最简单的例子:
[code lang=”java”]
public List getTopUsers(int limit) {
if (limit < 1) {
return null;
}
// …
}
[/code]
这个例子里首先判断传入的参数 limit,如果它小于 1,那后面的工作就不需要了,这里用了 return null 来处理这种情况。这个方法可能在许多地方被调用,每次调用结束,都要判断一下返回值是不是 null,如果不是 null,才可以进行正常的处理。这是多么繁琐的事情。
[code lang=”java”]
// The tedious way:
List topUsers = xxx.getTopUsers(limit);
if (topUsers == null) {
// …
} else {
for (…) {…}
}
[/code]
推荐的做法是返回一个零长度的 List,这样调用该方法结束后,无需判断返回值是否为 null,直接对其进行循环。不过是 return new ArrayList(0) 吗?尽管这种返回情况几率不是太大,但是每次创建一个新对象总是让人很不爽。幸好,Java 的标准库设计者已经在 Collections 类中放了一个空的 List 常量 EMPTY_LIST,除此之外,还有 EMPTY_MAP, EMPTY_SET,真是贴心。我相信主要还是集合类自己的实现代码中有很多地方用到了它们。于是,我们把 return null 改成 return Collections.EMPTY_LIST.
这里正好找到一个 Effective Java™ Programming Language Guide 的样章,讲的是 “Return zero-length arrays, not nulls”,基本上是一样的道理。Java 本身没有的空集合常量,我们可以自己定义嘛……事实上在我没有发现 Collections.EMPTY_LIST 的时候,我一直在自定义自己的 EMPTY_LIST 常量 🙂 不过注意一下该文中是怎么通过带参数的 List.toArray 方法去利用那个数组常量的,具体参考 Java 文档中的解释。
这是一个最基本的好习惯,让你的代码更整洁,而不会影响性能。鄙人还很弱,不过觉得一个优秀程序员的最基本素质是享受写代码的过程和代码本身,顺便享受其结果。
这里有一本 NetBeans API 设计者写的 Practical API Design: Confessions of a Java Framework Architect,我比较希望读一下。不过这种书中估计不会讲本文这么小儿科的东西的。
Leave a Reply