Java 语言的语法是以优雅著称的。至少我接触过的很多书籍、资料是这么说的,当然,以我数百行的 Java 编程经验来讲,我也在大多数的情况下感受到了这种优雅,直到遇到一个特殊情况。
这个情况是这样的。假设你写了一个数据访问的管理器,其中有一个方法提供给使用者以获取数据的能力,用我熟悉的 C 或者 C++,我会很快写出类似如下的函数定义:
1 |
size_t DataManager_GetData(void* buffer, size_t bufferSize); |
或者
1 2 3 4 5 6 |
class CDataManager { //... size_t GetData(void* buffer, size_t bufferSize); // ... }; |
输入的参数为接收数据的缓冲区以及缓冲区的大小,返回值则是返回数据的大小。当然,Java 支持这样的一个小需求毫无压力,示例代码我就不献丑了。接下来,对这个方法的需求略微有了一点增加,除了要返回取到的数据的大小之外,希望顺便还能给出一个指示,表示缓冲区内是否还有更多的数据可供获取。根据此需求,C++ 的方法原型通常会做如下的修订:
1 |
size_t GetData(void* buffer, size_t bufferSize, bool& moreData); |
那么 Java 呢,应该如何写出提供相同功能的方法原型?作为一个菜鸟,我尝试了传入一个 boolean 的参数(因为有朋友告诉过我 Java 的参数其实是“引用”,当然了,看到本文的朋友千万别这么天真地相信,否则我也不会傻乎乎写这篇文章),很显然地失败了。后来我又自作聪明地想起原生类型和对象类型在 Java 中似乎有所不同,于是把 boolean 改成 Boolean,满怀希望地出现奇迹,也以失败告终。
于是我求助于同事和朋友。答案很多。例如,把数据量和标记映射为一个条目,返回一个 Map 类型的对象。再例如,返回一个对象数组,如此等等。是的,我知道他们都是可以解决这个问题的方法,但是,我们呼应一下标题,我认为都不够优雅。因为我要同时返回的这两个数据,事实上相互之间的关系很弱,本质上是两个/两类信息,硬生生捏合在一起做为一个对象(Object,或者说物体)返回,我觉得很丑陋。可惜到目前我自己还没有能够想出更好的方案。
大家呢?敬请不吝赐教。当然,最好不要质疑需求,说是分成两次调用什么的。