2012-12-28 72 views
0

假設我有一個Foo類的對象foo。可以說類Foo有很多領域的特點,其後代。Java初始化對象設計

當有這麼多的字段時,是否最好通過Foo的構造函數初始化它們。

Foo foo = new Foo(0, 12, 123, 2, 2, (and so on...)); 

或初始化他們在構造函數或方法從類將使用foo例如。

Foo foo = new Foo(); 

public void initFoo() { 
    foo.setX(1); 
    foo.setY(3); 
    foo.setH(3); 
    (and so on...) 
} 

回答

4

我會盡全力通過構造函數。這樣,你不能忘記這樣做,並最終得到一個部分構造的對象。使用構造自然會導致使不變對象,而這些都是在能夠來思考自己的行爲(特別是在多線程環境)

條款中有用的後續行動,這將是使用builder pattern 。在這種情況下,您需要爲構建器組件提供參數,然後構建器可以確定缺少的參數和/或如何構建該對象。

例如

FooBuilder fb = new FooBuilder(); 
fb.setX(1); 
fb.setY(2); 
// etc... 
Foo f = fb.newInstance(); 

說了這麼多,你是否需要用這麼多參數構造你的對象?這聽起來像之一:

  1. 你的目標是做對自己太多,還是
  2. 這些參數可以組合成其他有意義的對象(例如xy座標爲point等)
0

個人而言,我會用你的第二個版本,即使用setX(),setY()等在構造函數中初始化。因爲你不會有部分構造的對象,它也看起來整潔。

1

一般來說,我會建議你使用第一種方法爲了鬆散耦合。 你的班級需要初始化多少成員並不重要。
只要你開始爲非平凡類編寫單元測試,你將需要這種方法,
你需要嘲笑這些成員。

如果您想了解更多與您的問題相關的設計決策,請瀏覽網頁獲取關於依賴注入,單元測試,控制反轉和鬆散耦合的更多信息。

+0

非常感謝!我肯定會調查這些條款。 +1 –