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
是不可变的,因此深度克隆整数数组没有任何价值。