【问题标题】:Return array vs fill array返回数组与填充数组
【发布时间】:2017-02-20 15:08:27
【问题描述】:

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

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

不过,我也看到过填充数组的方法作为参数传递,例如AffineTransform.getMatrix()

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

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

【问题讨论】:

    标签: java arrays methods data-structures return-value


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        有两种意见。

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

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

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

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

        【讨论】:

        • 但是您也必须创建一个数组才能将一个数组传递给该方法。例如double[] matrix = new double[16]; getMatrix(matrix); 如果您可以在后续调用中重复使用数组,它只会节省分配。
        • 感谢这些链接;如果我找到了他们,我可能不会问我的问题!节省内存的逻辑是我猜到的,但是当我在 AffineTransform 中找到该方法时,我仍然觉得很奇怪。 (一些 io 类也做同样的事情)这也让我很难在 JavaDoc 中找到我想要的东西,因为我正在寻找一个返回 double[] 的方法,而不是找到 void。
        • 如果传递或返回对数组等对象的引用,则接收者可以修改原始对象。如果您复制对象,则收件人无法修改原始对象。深拷贝可防止修改传递的实例引用的对象。这称为“防御性复制”,通常在程序正确性和可维护性比微优化更重要的情况下更可取。
        【解决方案4】:

        返回一个数组是一个好习惯,这增加了更好的解耦。

        传递数组的好处:

        • 使用相同的数组并减少垃圾收集的负载

        传递数组的缺点:

        • 最重要的一点:如果是多线程应用程序,如果传递的数组与多个线程共享,那么我们需要使这个数组同步,这会增加性能开销

        返回数组的好处:

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

        【讨论】:

          猜你喜欢
          • 2016-12-04
          • 1970-01-01
          • 1970-01-01
          • 2016-04-28
          • 2020-10-22
          • 2019-07-17
          • 2021-08-15
          • 1970-01-01
          • 2018-06-04
          相关资源
          最近更新 更多