2015-12-03 60 views
2

每次我創建一個新類我想知道什麼是創建構造函數的最佳方法。如果我使用的IntelliJ中取得的默認的構造函數,將創建一個類似例子A.一個構造函數,但在學校裏,我們學習使用梅索德B.我應該創建一個構造函數與設置器

有A和B.

之間有一些大的區別是有一些首選方式還是隻是程序員的選擇?

實例A:

public Model(int modelNumber) { 
    this.modelNumber = modelNumber; 
} 

實例B

public Model(int modelNumber) { 
    setModelNumber(modelNumber); 

} 

public void setModelNumber(int modelNumber) { 
    this.modelNumber = modelNumber; 
} 
+3

這取決於您是否需要可變字段或不可變字段。不變性具有[一些非常有吸引力的屬性],並且經常被推薦(例如在Effective Java中),但它需要你設置所有的值在構造函數中。 –

+4

在示例B中,您有風險讓子類重寫該方法 – Stultuske

回答

7

除非你的類被標記爲final,目前的形式例B肯定是不對的。

您需要遵循的原則是您不能從您的構造函數調用可覆蓋的方法。如果您不遵守該規則,則無法保留類不變量:您無法保證子類不會改變setModelNumber()所做的操作,並且您最終可能會收到modelNumber字段,該字段尚未初始化爲預期值值。

未能遵循這一原則可能會帶來其他不太明顯但同樣具有破壞性的consequences

因此,通常最好是直接從構造函數中設置字段。不僅如此,在final字段的情況下,即您的只有選項。

6

示例A是更優選的,當您創建對象時,需要調用構造函數來初始化類成員的值,setter和getters用於代碼中的其他函數以使用相同的成員!考慮例A變得非常重要。如果你想繼承這個類,你就不能執行調用setter。你不能讓你的課程不可繼承。因此答案是不!不要使用例子B!
乾杯!

1

我絕對的

同意這一觀點,你不能調用從你的構造」

as biziclop user said覆寫投放方法,所以要儘量避免在示例B!

此外,B示例比A更昂貴考慮處理器,而不是直接進入類屬性modelNumber,它必須首先轉到setModelNumber方法,一旦出現,必須使用指定的方法設置modelNumber。最後,兩個例子都是一樣的,但A更直接,更高效。

相關問題