1

如果爲某個方法添加第三個簽名,是否讓第二個和第三個變體直接調用第一個變體(實現的變體),還是讓第三個調用爲第二個,第二個爲第一個。重載標準協議的方法?

在我看來,額外的方法調用將會是你可能沒有的開銷,所以你希望所有的方法直接調用已實現的方法。

我想知道是否有人知道這樣做的任何「標準推薦方式」,或者如果它更個人的偏好或取決於上下文。當我向現有的重載方法添加一個新簽名時,我一直很好奇。你幾乎總是可以選擇以哪種方式來做到這一點。

哀婉愚蠢的例子:

現有的方法:

public String concatenate(String one, String two, String three) { 
    return(one+two+three); 
} 

public String concatenate(String one, String two) { 
    return(concatenate(one, two, "")); 
} 

要添加下一個,我該怎麼辦:

public String concatenate(String one) { 
    return(concatenate(one,"","")); 
} 

OR

public String concatenate(String one) { 
    return(concatenate(one,"")); 
} 

,是的,我知道的最後的方法本質上是沒有操作的。

+0

Java對吧?您可能希望使用您正在使用的語言標記。 – torak 2010-09-01 16:40:50

+0

嗯,我不認爲它專門應用於Java,看起來像一個適用於任何支持超載的語言的問題。 – 2010-09-02 12:35:18

回答

2

我更喜歡在可能的情況下創建一個所有其他加載器調用的私有方法。

private String _concatenateBase(String one, String two) 
{ 
    return one + two; 
} 


public String concatenate(String one, String two, String three) 
{ 
    return _concatenateBase(one+two, three); 
} 
+0

這可能與我如何去做有關,但可能不是私有的,因爲基本方法可能是在添加新簽名時最初公開的方法。另外,我很好奇你爲什麼重命名私有方法。 – 2010-09-02 12:37:13

+0

在我看來,重載是一種表達「做不同的投入來做同樣的事情」的概念的方式。這對班級的客戶來說非常有用:他們知道所有連接方法通過讀取名稱來完成的。 但是在(我的)基本方法是私有的情況下(也許比這個例子稍微複雜一點),我認爲它做了不同的事情:它實現了行爲,而其他方法*使用該實現。 當然這是一個幾乎沒有意義的細節:) – vulkanino 2010-09-02 16:04:18

1

我會通常使用較少的參數重載調用具有更多參數的重載,填充默認值。我懷疑我通常會盡量避免重複默認設置,所以我會讓你的第三個變體稱爲第二個變體,這將稱之爲第一個變體。但是,這絕對取決於確切的情況。在某些情況下,性能將是一個重要因素,但通常可讀性要重要得多。在大多數情況下,我懷疑在可讀性方面會有很大的差異,特別是如果默認值很簡單的話。

當然,在某些情況下,重載不是以這種線性方式構造的:可能有幾個重載都稱爲同一個「核心」重載,但如果它們提供的是不同的參數。