Java中对于多个返回参数的选项是有限制的。一种方法只能返回一个对象,数组或原始函数,和其他语言不同的是它不会提供一种简易方式来消耗方法调用中的参数。实际上我们的选择是返回一个对象数组,一个集合,仅为返回的参数创建一个类,或者最终将其发送到你打算替换的对象中。所有这些方法都存在缺陷:
使用对象数组
如果我们能够幸运地获取一套同类的返回参数,那么对象的数组就会是一个带有例外的选项,当我们打开这些对象时需要能分辨出每个参数。从另一方面来说,如果我们正在返回多个参数的不同类型,我们需要使用所有超类对象的数组--最有可能的就是对象本身。然后我们要抛出每一个打开的参数。我们已经丢失了类型安全性且返回参数命令出错的机会也可能增加。
使用集合
与使用数组的方法类似,我们或许也能创造一个集合来实现返回。在集合之上使用数组主要是因为创建集合所需要代码的数量要比这段代码短:
List< Object> retVal = new ArrayList< Object>();
retVal.add(string1);
retVal.add(num2);
retVal.add(object3);
return retVal;
而创建集合的代码要高于使用数组初始化设置:
return new Object[] {string1, num2, object3}
事实上在数组之上使用集合没有什么真正的优势,除非我们要使用映射以便通过名称或其他要素来返回值。
首次创建Java时,其简单程度是对日趋复杂的c++的一种颠覆。指针和内存管理被简化了,包括去除参数间接,常量,函数指针以及其他功能强大但容易混淆的性能。在c++中,我们可以用值或参照传递参数,这样可以对方法中的参照进行重新分配,并为你提供参数或返回更多值的方式。
使用JavaBeans
C++也支持的structs允许简单结构化的数据包。当然,Java类可以简单完成双倍于structs的任务,但通常习惯以大量模板来扩大源码。
使用类和JavaBeans惯例的时候还存在一个问题,即对象本质上是易变的。这些对象有可能被方法的调用者和方法调用的类共享,这样就会导致易变状态的共享,而这中情况无益于多线程系统。
在Java中,你能用值传递的只剩下方法参数了,而且还不能是outparams,同时方法只能返回一个参数。看一下任意代码库就会发现大量的实例,不过却不是十分有效。
改进Java Beans方式
那么应该怎样做呢?Java类选项事实上才是解决方案的关键以及对其方式进行改进。这些类可以成为structs更好的替代物。
让我们为返回的类确定两个参数:名称和出生日期:
public class PersonNameDOB {
private String name;
private Date dob;
public Date getDob() {
return dob;
}
public void setDob(Date dob) {
this.dob = dob;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}