比方说,我有一系列返回数组的函数。有什么更好的返回方法?我应该在函数中克隆每个数组还是在主函数中克隆它,还是根本不应该克隆它?
1)
static double[] a() {
double[] res = new double[3];
...
return res;
}
static double[] b() {
double[] res = a();
...
return res;
}
public static void main(String[] args) {
double[] arr = b().clone;
}
2)
static double[] a() {
double[] res = new double[3];
...
return res;
}
static double[] b() {
double[] res = a();
...
return res.clone;
}
public static void main(String[] args) {
double[] arr = b();
}
3)...
在这种情况下,我需要一些建议以作好作法。
答案 0 :(得分:1)
第一种方法看起来不错,但是clone()可能不必要。
总的来说,您可以直接将arr设置为b(),每次调用b()时都会创建一个新数组,因为a()已经在创建一个新数组
所以看起来像...
static double[] a() {
double[] res = new double[3];
...
return res;
}
static double[] b() {
double[] res = a();
...
return res;
}
public static void main(String[] args) {
double[] arr = b();
}
答案 1 :(得分:0)
我认为您应该几乎永远不要返回数组。您必须在失去对突变的控制和进行潜在的昂贵分配之间做出选择。
相反:
如果调用者出于特定的性能原因确实想要一个数组(这种情况很少见),请让他们传递自己的数组实例,并arrayCopy
将相关数据传递给它。返回长度。这就是例如InputStream.read
有效。
如果调用方想检查数据,而不关心以后是否更改,请在内部使用ArrayList
或类似内容,然后返回其Collections.unmodifiableList
视图。
如果返回的值无法更改,并且写入比读取更常见,请返回副本并确保其不可修改。如果您改变主意,则此API与下一点兼容。
如果返回的值不能更改,并且读取比写入更常见,请在内部使用不可变的数据结构,并仅返回引用。这与上一点兼容。