什么是返回数组的更好方法?

时间:2018-10-16 19:54:49

标签: java

比方说,我有一系列返回数组的函数。有什么更好的返回方法?我应该在函数中克隆每个数组还是在主函数中克隆它,还是根本不应该克隆它?

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)...

在这种情况下,我需要一些建议以作好作法。

2 个答案:

答案 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视图。

  • p>
  • 如果返回的值无法更改,并且写入比读取更常见,请返回副本并确保其不可修改。如果您改变主意,则此API与下一点兼容。

  • 如果返回的值不能更改,并且读取比写入更常见,请在内部使用不可变的数据结构,并仅返回引用。这与上一点兼容。