2016-11-29 103 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中找到類似的東西。

相關問題