簡體   English   中英

Setters vs Java中的重載構造函數

[英]Setters vs Overloaded constructors in 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
}

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

我已經在多個項目中對此構造函數具有依賴性。 現在,回到我的問題

  • 是否可以繼續將新字段添加到已經重載的構造函數中?
  • 每次我需要添加一個新字段時創建一個新的重載構造函數,這樣我就不會破壞依賴代碼?
  • 或者只是使用默認的空默認構造函數並僅使用setter(弄亂我的不變性,這不是高度關注)

你可以給我什么建議?

最愉快的方法是繼續將字段添加到構造函數中 - 擁有setter意味着你不能擁有不可變對象,並且不可變對象總是很好 - 但可能會調查構建器模式 ,這可以幫助你限制你自己只是一個被構建器對象調用並“填充”的構造函數。

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

然而,你的直覺是正確的:構造者可能變得笨拙。 為了再次推出其他海報,在這種情況下, 構建器模式可以為您提供兩全其美的效果。 如果您不希望構建器成為產品的嵌套類,如Wikipedia文章中的Java示例所示,那么只需將其放在與產品相同的包中,並為產品包提供保護的setter 。 此外,您可以添加邏輯以在調用者聲明構建完成時強制執行強制屬性的設置。

擁有不同構造函數的目的是提高類的可重用性。 我認為有一些不同的構造函數可以滿足您的需求而不是擁有大量的setter會更有幫助。 此外,構造函數更具體,並提高了類和api的可讀性。

您的其他依賴於2-arg構造函數的項目是否會以任何方式從新參數中受益? 2-arg構造函數是否符合您的新要求?

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

如果共享的有用方法很少而且很短,那么創建一個完全不同的類可能會更好,只是為了減少依賴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM