2016-02-12 242 views
4

在我的程序中,我讀取一個固定長度的文件,將每個字符串存儲在局部變量中,然後將每個值存儲到類類型數組列表中。爲了創建數組列表的對象,我使用了所有變量的參數構造函數。下面的代碼演示了這一點。沒有參數的構造函數或參數構造函數

String a = "text1"; 
String b = "text2"; 
SampleModel sm = new SampleModel(a,b); 
ArrayList<SampleModel> sampleList = new ArrayList<>(); 
sampleList.add(sm); 

我覺得這是絕對正確的,但我的同事要求我將其更改爲無參數構造函數,並調用getters和setter。那將如下所示。

SampleModel sm = new SampleModel(); 
ArrayList<SampleModel> sampleList = new ArrayList<>(); 
String a = "text1"; 
String b = "text2"; 
sm.setA(a); 
sm.setB(b); 
sampleList.add(sm); 

是否有任何理由更喜歡參數構造函數的無參數構造函數? (我的程序有大約15個變量)

+1

這是一個寫得很好的具體問題。這絕對是主題(但是我沒有檢查過dups)。 –

回答

7

這取決於如何使用該類。

例如,一個不可變類將需要一個構造函數,該構造函數接受參數,並且不需要setter。

但是一個Java Bean將需要一個無參數的構造函數和setters。

有些事情要考慮:

  • 膠囊化可以是有價值的。除了像JavaBeans這樣的特殊情況,通常可以根據所需的交互來設計類的接口,而不是基於當前的數據成員集。
  • 方法有名稱。 Java不支持命名參數。方法名稱在調用代碼中傳遞實際參數的使用方式。如果你的類有很多參數,通過方法傳遞它們會導致更具可讀性的調用代碼。
  • 不可變類具有價值。如果你直接在你的類中添加命名setter,它不會是不可變的。構建器模式允許您接受構建參數,即使對於不可變類也是如此。
1

接受參數的構造函數實質上是爲了方便(儘管如果對象需要參數才能被正確構建,情況並不總是如此)。它的做法與set方法完全相同。

只要這些參數在對象上下文中「有意義」,沒有理由沒有構造函數接受參數。換句話說,它不僅僅是一個正確的東西,而是一個語義學的東西。

如果構造是:

public SampleModel(String a, String b) 
{ 
    this.a = a; 
    this.b = b; 
} 

可能不會有所作爲。

+0

非常感謝你 –

2

無論我用存取函數的一類變量取決於兩個因素:

  1. 變量是否是必要的或可選的對象。
  2. 它是否可能在使用該對象的過程中發生變化,或者是否爲final

必要和最終的變量應該在構造函數中,在我看來,不應該有變異函數。變量是可選的,應該有訪問器和增變器。重要但可能會改變的變量取決於您的判斷。我可能會把它們放在構造函數中,但使用Builder設計模式來避免構造函數有一長串參數。

+0

非常感謝你 –

+0

根據當前表示設計類的接口有時是一個錯誤。表示的封裝經常是有價值的。除了像JavaBeans這樣的特殊情況之外,考慮根據您希望與對象支持的交互來設計接口。 –

+0

這是一個非常好的觀點。如何改變我在上面寫的內容? – TangledUpInBlue

0

這可能只是因爲比擁有大的逗號分隔列表更容易看到發生了什麼。這也可能是使用雙大括號初始化一個不錯的地方:從福勒和貝克書

String a = "text1"; 
String b = "text2"; 
SampleModel sm = new SampleModel() {{ 
    setA(a); 
    setB(b); 
}}; 
ArrayList<SampleModel> sampleList = new ArrayList<>() {{ 
    add(sm); 
}}; 
0

報價:「重構」

長參數列表

在我們早期的節目裏,我們都教導傳遞作爲參數所需的一切例程。這是可以理解的,因爲替代方案是全球數據,全球數據是邪惡的,通常是痛苦的。對象改變了這種情況,因爲如果你沒有你需要的東西,你總是可以要求另一個對象爲你得到它。因此,使用對象時,您不會傳遞該方法所需的所有內容;而是通過足夠的方法,以便該方法可以達到所需的一切。該方法的主機類有很多方法需要。在面向對象的程序中,參數列表往往比傳統程序小得多。這很好,因爲長參數列表很難理解,因爲它們變得不一致並且難以使用,並且因爲您需要更多數據而永遠改變它們。大部分更改都是通過傳遞對象來移除的,因爲您很可能只需要發出幾個請求來獲取新的數據。如果您可以通過提出您已知的對象的請求來獲取一個參數中的數據,請使用替換參數和方法。這個對象可能是一個字段,或者它可能是另一個參數。使用保留整個對象從對象中搜集一堆數據,並用對象本身替換它。如果您有幾個數據項沒有邏輯對象,請使用引入參數對象。進行這些更改有一個重要的例外。這是當你明確不想創建從被調用對象到更大對象的依賴。在這些情況下解包數據並將其作爲參數發送是合理的,但要注意所涉及的痛苦。如果參數列表太長或者經常更改,則需要重新考慮依賴關係結構。

+0

那麼,如果有很多變量並且它們經常變化,那麼沒有參數構造函數會是一個好選擇? –

+0

是的,但還有另一個考慮因素,即長參數列表可能難以理解和使用。 – Learner

+0

是啊,計數:)謝謝 –