2014-04-07 30 views
0

這是什麼意思?最容易通過代碼顯示更新參考或返回參考

import java.util.Date; 

public class Example { 

    public static void main(String... args) { 
    Date d1 = new Date(2014,4,7); 
    Date d2 = new Date(2014,4,7); 

    methodA(d1); 
    System.out.println("Month of d1: " +d1.getMonth()); 

    d2 = methodB(d2); 
    System.out.println("Month of d2: " +d2.getMonth()); 
    } 

    public static void methodA(Date d) { 
    d.setMonth(6); 
    } 

    public static Date methodB(Date d) { 
    d.setMonth(6); 
    return d; 
    } 

} 

首先忽略棄用的日期代碼。在討論可變對象如Date時,最好是在methodB中進行更改並返回引用,或者可以使用methodA的方法嗎?

我懷疑methodB是大多數人會選擇的,但爲什麼?

注意methodA在使用可變對象時只具有與methodB相同的結果。換一個Integer的日期例如,在調用methodA之後,第一個對象的值將保持不變(假設methodA和methodB對兩個相同值的Integer引用都做簡單增量)

+0

去我不會說'methodB'是大多數人選擇的。在某些情況下,有必要使用'methodB',在其他情況下,它並不重要 – mangusta

+2

哇,有0個upvotes的問題和0個upvotes的7個答案..必須是某種記錄! –

+0

仍然在upvoting和標記之間折騰,主要是基於意見的..不能決定,arg! –

回答

3

我更喜歡methodA因爲很顯然你會修改我提供的論點。

我發現methodB誤導它的當前形式,因爲我會假設參數不會被修改,實際上它將會被修改。你總是可以編輯代碼,以消除這種誤導行爲:

public static Date methodB(Date d) { 
    Date result = d.clone(); 
    result.setMonth(6); 
    return result; 
} 

在一定程度上,methodB允許方法鏈接,但它是罕見返回的對象是參數本身。更多的時候,返回的對象是你在調用該方法的同一個類:

public class DateManipulator { 

    public DateManipulator(Date d) { 
    // store d 
    } 

    public static DateManipulator methodB() { 
    d.setMonth(6); 
    return this; 
    } 

    public static Date build() { 
    return d; 
    } 
} 

它允許構建:因爲它使

new DateManipulator(d).methodB().methodC()....build(); 
+0

謝謝,如果methodB按照您的建議修改,methodA仍然是您的偏好? – PDStat

+0

@PaulStatham我個人會選擇'methodA',因爲它會給調用者留下克隆(或其他)的挑戰。在很多情況下,他們不需要保留先前的對象狀態。 –

0

大多數人會贊成選項2

Example.methodB(...).someThing() 

但是,如果有一些其他信息可以通過方法返回,則應該不惜一切代價避免這種情況(一種常見例如返回一個表示方法成功或失敗的布爾值)。

常見的例子是StringBuilder類。 StringBuilder.append()返回一個StringBuilder(this),所以你可以鏈接append()命令。

請注意,此方法通常用於調用對象(如StringBuilder示例),但參數變體也非常好。

0

一般我寧願methodA,因爲我會考慮返回另一個對象,因爲這意味着原件沒有被修改。所有的String處理方法都是例子。

不過,也有某些特殊情況下,比如生成器模式,在如何methodB作品是明確的,你得到的好處是可以鏈的調用。消費者可能會被期望知道建造者的模式,因此methodB在這種情況下不會產生誤導。

0

它既不好也不壞。這取決於實際情況。

例如,作爲方法鏈的粉絲,我很少會使用這兩種方法之一。我寧願

public Example methodC(Date d) { 
    d.setMonth(6); 
    return this; 
} 

雖然應避免這樣的副作用的方法(和我會考慮改變傳入的參數的特性是一個副作用,在大多數情況下),最的時間。

0

我想有一個無聲的約定,你不真的改變像Java那樣的方法參數。有一些例外情況,如Collections.sort方法等。在Ruby中,更改參數的方法標有感嘆號(!)是一種很好的定製。但是,整數和字符串參數更改不會影響方法範圍外的值。據我所知,他們有整數/字符串池中的對象。

0

「我懷疑methodB是大多數人會選擇的,但爲什麼?」

不是真的,methodA更新場month在對象d1,相同方法methodB會做,並且方法methodB返回傳遞的對象,return語句是多餘的

這意味着大多數人實際上methodA