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

Java 直接返回一个对象数组是一种不好的做法吗?,java,arrays,object,methods,copy,Java,Arrays,Object,Methods,Copy,例如,如果我们有一个类,它的一个方法返回一个对象,那么我们应该返回该对象的深层副本 例如,在返回整数数组之前,我们还应该在返回数组之前对其进行深度复制/克隆 对象数组也是这样吗?例如,我有一个包类型的对象数组: //trunk[] is an instance variable array that contains objects of type Package in this class //method to return array public Package[] g

例如,如果我们有一个类,它的一个方法返回一个对象,那么我们应该返回该对象的深层副本


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

对象数组也是这样吗?例如,我有一个包类型的对象数组:

//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;
    }
//trunk[]是一个实例变量数组,其中包含此类中Package类型的对象
//方法返回数组
公共包[]getTrunk(){
包裹[]温度=新包裹[树干长度];
对于(int i=0;i

因为对象是引用类型,所以在这里使用for循环有什么用处吗?如果没有,我应该如何正确返回数组?

在这个问题上,原语数组和复杂类型(某种类型的对象)数组没有区别。所以一般来说,你可以说,是的,你应该只返回一份副本

但也有一些例外情况,返回副本可能是有意的,因为:

  • 实际上,您希望调用方能够操纵备份阵列
  • 复制需要时间。一些核心Java类不返回副本以避免开销(例如)

关于这个问题,基本体数组和复杂类型数组(某种类型的对象)之间没有区别。所以一般来说,你可以说,是的,你应该只返回一份副本

但也有一些例外情况,返回副本可能是有意的,因为:

  • 实际上,您希望调用方能够操纵备份阵列
  • 复制需要时间。一些核心Java类不返回副本以避免开销(例如)

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

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

答案部分取决于打电话的人是谁。如果是我的代码调用我的代码,并且我知道我不是在修改数组,只是查看它,甚至不保留副本,那么返回实际的数组就可以了。不是每个接口都需要防白痴;傻瓜打样有价格标签

(我看到这是一个“公共”界面,但这可能仅仅意味着一个多包预模块产品结构)


在我看来,你不应该担心一些虚构的“最佳实践”,你应该担心你希望软件如何运行。

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

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

答案部分取决于打电话的人是谁。如果是我的代码调用我的代码,并且我知道我不是在修改数组,只是查看它,甚至不保留副本,那么返回实际的数组就可以了。不是每个接口都需要防白痴;傻瓜打样有价格标签

(我看到这是一个“公共”界面,但这可能仅仅意味着一个多包预模块产品结构)


在我看来,你不应该担心一些虚构的“最佳实践”,你应该担心你希望软件如何运行。

返回Arrays.copyOf(trunk,trunk.length)Integer
是不可变的,因此深度克隆数组没有任何价值。
return array.copyOf(trunk,trunk.length)Integer
是不可变的,因此深度克隆整数数组没有任何价值。