2016-11-29 58 views
1

修改此参数后,使方法返回作为参数传递给它的方法是一种不好的做法吗?在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; 
} 
+0

只有当你不清楚你在做什么时才会有问题。 – khelwood

+1

你没有做任何事情,你没有制作副本。 – matt

+0

这取决于你期望与参数 发生什么你应该考虑你传递的参数的类型,例如,如果你传递一个对象并且你改变了引用或者它是一个原始变量 –

回答

1

如果您总是返回传递给该方法的相同数组,则不需要返回它。该方法可以简单地具有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()),则没有必要复制输入数组。

0

返回参数没有意义,这种方法不应该返回任何东西。相反,方法应该有void返回类型签名和一个有意义的名称,如applyLeftRotation

当您将作为参数传递的对象修改并返回时,这是一种不好的做法。其他开发人员会认为你已经返回了一个新的对象。

但是,如果您返回一个作为参数接收到的新对象,则这是完全正常的。这些是所谓的immutable objects。此外,您可以在builder pattern中找到类似的东西。

相关问题