2012-03-27 53 views
5

我不確定以前是否有過類似的問題,但是沒有得到任何有用的答案。Setter vs Java中的重載構造函數

如問題所示,有什麼更好的,有重載的構造函數或有多個setter函數?

場景:

public class Something { 

    private int a; 
    private int b; 

    public Something(int a, int b) { 
     this.a = a; 
     this.b = b; 
    } 
    ... // Do Something 
} 

現在,我的基本要求是隻有兩個參數。現在明天,要求被改變了,我被要求添加一個新的參數c,然後在第二天d,並給出一個聲明說我們可以有更多的字段。

我已經有這個構造函數在多個項目的依賴項。現在,回到我的問題

  • 是否建議繼續添加新的字段到已經重載的構造函數?
  • 每次我需要添加一個新字段以便不中斷相關代碼時,創建一個新的重載構造函數?
  • 或者只使用默認空的默認構造函數,並且只使用setter方法(搞亂了我的不變性,這是高度關注的不是)

是什麼,你可以給我的建議嗎?

+4

「弄亂了我的不變性,這不是高度關注的問題」如果你已經努力使某個類不可變(因此更容易推理),不要輕易放棄這個工作。 – 2012-03-27 01:39:44

+1

'......有什麼更好的,有一個重載的構造函數或有多個setter函數?「」是「。但嚴重的是,這一切都取決於上下文。有時你需要兩者,有時你需要在JavaBeans限制內工作,... – 2012-03-27 01:40:14

回答

9

最好的方法是繼續添加字段到你的構造函數中 - 讓setter意味着你不能擁有不可變的對象,而不可變的對象總是很好 - 但可能調查builder pattern,它可以幫助你限制一個構造函數被構建器對象調用和「填充」。

+1

構造函數/方法重載可能會讓人困惑。生成器模式有時很有用(+1) – 2012-03-27 01:50:48

1

擁有不同構造函數的目的是提高類的可重用性。我認爲有幾個不同的構造函數可以滿足您的需求,而不是有很多setter,這會更有幫助。 此外,構造函數更具體,並提高您的類和api的可讀性。

+0

實際上,就API可讀性和可重用性而言,setter具有優勢,IMO。您可以選擇並設置要設置的內容,每個看到調用它們的代碼的人都知道他們在做什麼,而不是看到構造函數的第一個和第二個字符串參數,並想知道它們應該是什麼,哪個是哪個。 – trutheality 2012-03-27 02:44:12

4

與構造函數相比,構造函數的好處在於它允許您爲實例強制實施所需屬性的設置,而不是讓對象處於不良狀態,直到調用正確的設置器爲止。另外,正如其他海報所提到的,不變性可能是一件非常好的事情,特別是在多線程環境中。

儘管如此,你的直覺是正確的:建設者可能變得笨拙。再次推出其他海報,builder pattern可以在這種情況下給你兩全其美。如果您不希望構建器成爲產品的嵌套類(如Wikipedia文章中的Java示例所示),那麼只需將它與產品放在同一個包中,然後將產品包保護的設置器。另外,當調用者聲明構建完成時,您可以添加邏輯來強制強制屬性的設置。

0

您的其他項目是否依賴於2參數構造函數以任何方式從新參數獲益? 2-arg構造函數對你的新需求有意義嗎?

也許您需要創建另一個課程,例如SomethingEx(Something)它將攜帶附加字段並具有不同的構造函數,但會共享有用的方法。

如果有用的共享方法很少很短,最好創建一個完全不同的類,以減少依賴關係。