Java 返回数组与填充数组

Java 返回数组与填充数组,java,arrays,methods,data-structures,return-value,Java,Arrays,Methods,Data Structures,Return Value,我见过两种方法,它们的目标是返回一个值数组。第一个是最明显的: public double[] getArray() { ... return ...; } 但是,我也看到了填充作为参数传递的数组的方法,例如AffineTransform.getMatrix(): 每种方法的优缺点是什么,在哪些情况下更可取?另外,使用第二种方法而不仅仅是第一种方法背后的逻辑是什么?第一种方法是更好的实践。第二种方法意味着您可以“变异”参数flatmatrix,因此无法确定该矩阵包含什么。现在,

我见过两种方法,它们的目标是返回一个值数组。第一个是最明显的:

public double[] getArray() {
    ...
    return ...;
}
但是,我也看到了填充作为参数传递的数组的方法,例如
AffineTransform.getMatrix()


每种方法的优缺点是什么,在哪些情况下更可取?另外,使用第二种方法而不仅仅是第一种方法背后的逻辑是什么?

第一种方法是更好的实践。第二种方法意味着您可以“变异”参数flatmatrix,因此无法确定该矩阵包含什么。现在,如果这是期望的行为(改变数组),那么第二个更合适


我倾向于不改变参数,太容易出错。

有两种观点

如果返回一个数组,则必须创建新的数组,这样会占用更多内存

如果将数组传递到方法中,则可以节省内存并提高性能(由于垃圾收集)。但它也违反了规则

对我来说,修改输入参数,尤其是数组是一种非常糟糕的做法。避免这种情况的最好方法是将此逻辑封装到另一个类中

有一些关于它的信息性问题:


矩阵方法喜欢修改数组的原因是它们经常用于图形和绘图调用。它们的编写方式允许重用数组

最好不要在每秒调用60次的绘图例程中导致分配。当这种情况发生时,会导致更频繁的垃圾收集,从而触发暂停,用户可以看到一些丢弃的帧

就个人而言,除非出于性能原因,否则我不会复制第二种技术

如果我决定重用和修改一个对象,我会通过对象上的方法,即OO风格,而不是修改输入的过程风格的方法来实现。e、 g

public class Matrix {
    public void setFromTransform(AffineTransform transform){
    }
}

返回数组是一种很好的做法,这会增加更好的解耦

通过阵列的优点:

  • 使用相同的数组并减少垃圾收集的负载
通过阵列的缺点:

  • 最重要:对于多线程应用程序,如果传递的数组与多个线程共享,那么我们需要使该数组同步,这将增加性能开销
返回阵列的优点:

  • 更好的解耦,因为调用方只需获取返回的数组并对其进行处理
  • 调用方不需要预处理,方法只返回结果数组(用一些固定值填充它,或者如果需要,将其置为空)

但您也必须创建一个数组才能将一个数组传递到该方法中。e、 g.
double[]矩阵=新的double[16];getMatrix(矩阵)只有在您可以在后续调用中重新使用阵列时,它才会保存分配。感谢这些链接;如果我找到了他们,我可能就不会问我的问题了!内存节省逻辑是我所猜测的,但当我在仿射变换中发现这个方法时,我仍然觉得很奇怪。(一些io类也做同样的事情)这也使得我很难在JavaDoc中找到我想要的东西,因为我正在寻找一个返回double[]的方法,而不是找到void。如果你传递或返回一个对像数组这样的对象的引用,那么接收者可以修改原始对象。如果复制对象,则收件人无法修改原始对象。深度复制防止修改传递的实例引用的对象。这被称为“防御性复制”,通常在程序正确性和可维护性比微优化更重要的情况下更可取。
public class Matrix {
    public void setFromTransform(AffineTransform transform){
    }
}