在Java中返回作为参数传递的参数是否是一种不好的做法?
问题描述:
修改此参数后,使方法返回作为参数传递给它的方法是一种不好的做法吗?在Java中返回作为参数传递的参数是否是一种不好的做法?
public int[] arrayLeftRotation(int[] x) {
for(int i=0;i<x.length;i++){
x[i]=1;
}
return x;
}
与修改和返回参数副本相反。
public int[] arrayLeftRotation(int[] x) {
int[] y = x;
for(int i=0;i<y.length;i++){
y[i]=1;
}
return y;
}
答
如果您总是返回传递给该方法的相同数组,则不需要返回它。该方法可以简单地具有void
返回类型。
采取例如ArrayList.toArray()
实现:
public <T> T[] toArray(T[] a) {
if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
它接受一个数组作为输入,并且可返回同一阵列的实例(在修改之后),但在某些情况下,它返回一个不同(新)阵列。这是返回数组而不是有void
返回类型的唯一原因。
顺便说一句,在你的第二个代码片段中,你正在返回相同的数组。 int[] y = x
不会创建副本。要创建副本,请使用int[] y = Arrays.copyOf(x,x.length);
。创建副本是否合理取决于用例。如果该方法的目的是修改输入数组(如ArrayList.toArray()
),则没有必要复制输入数组。
答
返回参数没有意义,这种方法不应该返回任何东西。相反,方法应该有void
返回类型签名和一个有意义的名称,如applyLeftRotation
。
当您将作为参数传递的对象修改并返回时,这是一种不好的做法。其他开发人员会认为你已经返回了一个新的对象。
但是,如果您返回一个作为参数接收到的新对象,则这是完全正常的。这些是所谓的immutable objects。此外,您可以在builder pattern中找到类似的东西。
只有当你不清楚你在做什么时才会有问题。 – khelwood
你没有做任何事情,你没有制作副本。 – matt
这取决于你期望与参数 发生什么你应该考虑你传递的参数的类型,例如,如果你传递一个对象并且你改变了引用或者它是一个原始变量 –