直接返回对象数组是不好的做法吗?

时间:2020-07-24 00:03:07

标签: java arrays object methods copy

例如,如果我们有一个类,并且其中一个方法返回一个对象,则应返回该对象的深层副本。

例如,在返回整数数组之前,我们还应该在返回数组之前进行深度复制/克隆。

对象数组也是如此吗?例如,我有一个类型为package的对象数组:

//trunk[] is an instance variable array that contains objects of type Package in this class

    //method to return array
    public Package[] getTrunk() {
        Package[] temp = new Package[trunk.length];
        
        for(int i = 0; i < trunk.length; i++) {
            temp[i] = trunk[i];
        }
        return temp;
    }

由于对象是引用类型,这里是否有使用for循环的用途?如果没有,应该如何正确返回数组?

2 个答案:

答案 0 :(得分:2)

如果返回中继线阵列,则呼叫者可以修改中继线阵列。如果返回中继线阵列的副本,则调用者无法修改中继线阵列。

您是否关心呼叫者是否可以修改中继线阵列?

该问题的答案部分取决于呼叫者是谁。如果这是我的代码调用我的代码,并且我知道我不是在修改数组,只是查看它甚至不保留副本,那么返回实际的数组可能就可以了。并非每个接口都需要防白痴。防白痴标价。

(我看到这是一个“公共”接口,但这可能只是意味着多包装的模块前产品结构)

在我看来,您不必担心某些神话般的“最佳实践”,而应该担心软件的行为方式。

答案 1 :(得分:0)

关于这个问题,原始数组和复杂类型数组(某种对象)之间没有区别。因此,通常您可以说,是的,您应该只返回一份副本。

但是在某些情况下,可能会返回副本,因为

  • 您实际上希望调用者能够操纵支持的数组
  • 复制需要时间。一些核心Java类不会为避免开销而返回副本(例如ByteBuffer#array()