2017-02-20 86 views
1

我见过两种一般类型的方法,其目标是返回一组值。首先是最明显的:返回数组vs阵列

public double[] getArray() { 
    ... 
    return ...; 
} 

但是,我也看到了方法,填补作为参数传递阵列,如AffineTransform.getMatrix()

public void getMatrix(double[] flatmatrix) { 
    ... 
    flatmatrix[0] = ...; 
    .... 
} 

什么是每种方法的利弊,哪种情况更适合?此外,使用第二种方法背后的逻辑是什么,而不仅仅是使用第一种方法?

回答

1

原因矩阵方法希望修改阵列的是,他们在显卡频率和使用绘图调用。这些写入的方式允许重用数组。

希望在一个正在被调用的绘图程序内部不会导致分配,这可能是每秒60次。当发生这种情况时,它会导致更频繁的垃圾回收,从而导致暂停,用户可以看到一些丢失的帧。

就个人而言,我会避免复制第二种技术,除非出于这种性能原因。

如果我决定要重用和变异一个对象,我会通过该对象的OO风格的方法来代替修改输入的过程风格方法。例如

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

第一种方法是更好的做法。第二种方法意味着你可以“改变”参数flatmatrix,因此不能确定矩阵是什么。现在,如果这是所需的行为(改变数组),那么第二个更合适。

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

1

有两种意见。

如果你返回一个数组 - 你必须创建新的数组,因此你花费更多的内存。

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

至于我,修改输入参数,特别是数组是一个非常糟糕的做法。避免它的最好方法是将这个逻辑封装到另一个类中。

还有一些知识性的问题吧:

+0

但是你必须创建一个数组传递给方法。例如'double [] matrix = new double [16]; getMatrix(matrix);'如果你可以在随后的调用中重新使用数组,它只会节省分配。 – weston

+0

感谢您的链接;如果我找到了他们,我可能不会问我的问题!记忆储存逻辑就是我猜到的,但当我在AffineTransform中找到该方法时,我仍然认为这很奇怪。 (有些io类也做同样的事情)它也使我很难找到我在JavaDoc中寻找的东西,因为我正在寻找一个返回double []的方法,而不是找到void。 – ostrichofevil

+0

如果您传递或返回对像数组这样的对象的引用,那么收件人可以修改原始对象。如果复制对象,则收件人无法修改原始对象。深度副本可防止修改传入实例引用的对象。这被称为“防御性复制”,通常在程序正确性和可维护性比微优化更重要的情况下更好。 –

0

返回一个数组是一个很好的做法,这增加了更好的解耦。

  • 使用相同的阵列,并降低负载上的垃圾收集

缺点传递数组的:

  • 最重要的:

    传递数组的优势在多线程应用程序的情况下,如果传递的数组与多个线程共享,那么我们需要使这个数组同步识别的这将增加性能开销

返回数组的

优点:

  • 更好的去耦的调用者只得到返回的数组并对其进行处理
  • 来电不需要预处理,方法只是返回结果数组(填充一些固定值或使它为空,如果需要的话)