2011-07-07 44 views
6

如果一個方法填充/修改一個對象,最好是返回對象還是保持返回類型爲void,並且該方法將通過其引用修改對象?Java返回對象/修改對象(編碼指南)

public Obj populate(Obj o) 
{ 
.... 
return o; 
} 

public void populate(Obj o) 
{ 
.... 
} 

我知道這是一個微不足道的問題,但哪一個是最受歡迎的?

+0

對於'''return o'''語句取決於您的conrete實現。通過ref傳遞對象將修改堆棧中的對象。對我'''返回''''聲明是不需要的。 – glg

+0

http://stackoverflow.com/questions/40480/is-java-pass-by-reference –

回答

2

我依賴於你的風格,但返回的一個好處是:你可以撥打populate(o).doSomethingElse();,即你可以鏈接方法調用。

看一看StringBuilder請問是怎麼例如,允許這樣的事情new StringBuilder().append("a").append("b")....

+2

StringBuilder不返回它的參數。它返回自己。 –

+1

注意:它是OP返回的參數,而不是聲明該方法的類型。 –

1

我會說「第一」選項,返回對象。這沒有缺點,並且留出空間以便將來更改實現(例如,返回「深層副本」而不是同一個對象)而不修改簽名。

總之,我覺得它更靈活。

0

我會選擇第一個,因爲它允許您選擇修改傳遞的對象並返回它,或者獲取對象的副本並返回副本。

public Obj populate(Obj o) 
{ 
    Obj returnObj = o.clone(); 
    .... 
    return returnObj; 
} 

這允許您保留對原始對象的引用並引用修改後的對象。

0

最好修改對象this並保持參數不變。

class ModifiedType { 
    public ModifiedType populate(UnmodifiedType arg) { 
     return this; 
    } 
    // or 
    public void populate(UnmodifiedType arg) { 

    } 
} 

以StringBuilder爲例。

0

第二個對我來說不那麼讓人困惑,因爲從第一個不清楚,如果返回和傳遞的對象是相同的,並且忽略返回的值我不覺得正常。

2

我一般會跟Command-Query separation一起去。

也就是說,如果方法改變參數,它不應該也返回參數。

然而,(如上文維基百科文章所述)違反這一一般原則的情況是適當的。