的语言来说可有点困难,因为它们不能返回一个数组,而是只能返回指向数组的指针。这
会造成一些问题,因为它使得控制数组的生命周期变得很困难,并且容易造成内存泄漏。
Java 采用类似的方法,但允许你直接“返回一个数组”。与 C++不同,使用 Java 你不需
要担心要为数组负责——只要你需要它,它就会一直存在,当你使用完后,垃圾回收器会
清理掉它。
下例演示了如何返回 String 数组:
//: c11:IceCream.java
// Returning arrays from methods.
import com.bruceeckel.simpletest.*;
import java.util.*;
public class IceCream {
private static Test monitor = new Test();
private static Random rand = new Random();
public static final String[] flavors = {
"Chocolate", "Strawberry", "Vanilla Fudge Swirl",
"Mint Chip", "Mocha Almond Fudge", "Rum Raisin",
"Praline Cream", "Mud Pie"
};
public static String[] flavorSet(int n) {
String[] results = new String[n];
boolean[] picked = new boolean[flavors.length];
for(int i = 0; i < n; i++) {
int t;
do
t = rand.nextInt(flavors.length);
while(picked[t]);
results[i] = flavors[t];
picked[t] = true;
}
return results;
}
public static void main(String[] args) {
for(int i = 0; i < 20; i++) {
System.out.println(
"flavorSet(" + i + ") = ");
String[] fl = flavorSet(flavors.length);
for(int j = 0; j < fl.length; j++)
System.out.println("\t" + fl[j]);
monitor.expect(new Object[] {
"%% flavorSet\\(\\d+\\) = ",
new TestExpression("%% \\t(Chocolate|Strawberry|"
+ "Vanilla Fudge Swirl|Mint Chip|Mocha Almond "
+ "Fudge|Rum Raisin|Praline Cream|Mud Pie)", 8)
});
}
}
} ///:~
方法 flavorSet()创建了一个名为 results 的 String 数组。此数组容量为 n,由传入方法
的参数决定。然后从数组 flavors 中随机地选择元素,存入 results 中,此方法最终返回
results 数组。返回一个数组与返回任何其他对象(本质是引用)没什么区别。数组是在
flavorSet()中被创建的,还是在别的地方被创建的并不重要。当你使用完毕后,垃圾回收
器负责清除数组,而只要你还需要它,此数组就会一直存在。
说句题外话,注意当 flavorSet()随机选择各种 flavor(数组的元素)时,它确保不会重复
选择。由一个 do 循环不断进行随机选择,直到找出一个在数组 picked 中还不存在的元素。
(当然,还会比较 String 以检查随机选择的元素是否已经在数组 results 中。)如果成功,
将此元素加入数组,然后查找下一个(i 递增)。
main() 打印 20 个完整的 flavor 的集合,因此可以看出 flavorSet() 每次确实是在随机
选择 flavor。最容易看到执行效果的方式是将输出信息重定向到一个文件。当你查看这个
文件时,要记住,你只是“想要”冰激凌,并不是“需要”冰激凌。