如果一個方法填充/修改一個對象,最好是返回對象還是保持返回類型爲void,並且該方法將通過其引用修改對象?Java返回對象/修改對象(編碼指南)
public Obj populate(Obj o)
{
....
return o;
}
public void populate(Obj o)
{
....
}
我知道這是一個微不足道的問題,但哪一個是最受歡迎的?
如果一個方法填充/修改一個對象,最好是返回對象還是保持返回類型爲void,並且該方法將通過其引用修改對象?Java返回對象/修改對象(編碼指南)
public Obj populate(Obj o)
{
....
return o;
}
public void populate(Obj o)
{
....
}
我知道這是一個微不足道的問題,但哪一個是最受歡迎的?
我依賴於你的風格,但返回的一個好處是:你可以撥打populate(o).doSomethingElse();
,即你可以鏈接方法調用。
看一看StringBuilder
請問是怎麼例如,允許這樣的事情new StringBuilder().append("a").append("b")....
StringBuilder不返回它的參數。它返回自己。 –
注意:它是OP返回的參數,而不是聲明該方法的類型。 –
我會說「第一」選項,返回對象。這沒有缺點,並且留出空間以便將來更改實現(例如,返回「深層副本」而不是同一個對象)而不修改簽名。
總之,我覺得它更靈活。
我會選擇第一個,因爲它允許您選擇修改傳遞的對象並返回它,或者獲取對象的副本並返回副本。
public Obj populate(Obj o)
{
Obj returnObj = o.clone();
....
return returnObj;
}
這允許您保留對原始對象的引用並引用修改後的對象。
最好修改對象this
並保持參數不變。
class ModifiedType {
public ModifiedType populate(UnmodifiedType arg) {
return this;
}
// or
public void populate(UnmodifiedType arg) {
}
}
以StringBuilder爲例。
第二個對我來說不那麼讓人困惑,因爲從第一個不清楚,如果返回和傳遞的對象是相同的,並且忽略返回的值我不覺得正常。
對於'''return o'''語句取決於您的conrete實現。通過ref傳遞對象將修改堆棧中的對象。對我'''返回''''聲明是不需要的。 – glg
http://stackoverflow.com/questions/40480/is-java-pass-by-reference –