2011-08-17 151 views
4

何時應該傳遞參數給對象的構造函數?您使用哪些標準將它們傳遞給構造函數而不是對象方法中的參數?OOP對象構造函數參數

回答

0

通常,在使用new關鍵字實例化類時,將參數傳遞給類構造函數(這可能因語言而異)。

例如(選擇了對C /的Java/C#風格在這裏)

MyClass class = new MyClass(arg1, arg2, arg3); 

在重新閱讀你的問題,我傾向於使用構造函數的參數爲​​絕對需要的資源。這樣,你就知道你的對象必須有某些可用的屬性或資源。

+0

「...需要的資源......」我想過但不知道:) – thom

1

當我的對象非常簡單(1或2個屬性)我可以提供一個構造函數與這些參數。

但大部分時間,默認的構造函數和我設置我的屬性與setters。

+0

好吧,一個簡單的對象是一個標準......謝謝。 – thom

+0

這不是一個非常強大的設置,可能會導致nullPointer錯誤。 (想象別人使用你的班級,但他們不知道他/她需要用setter設置所有內容)。 – Rob

+0

好吧,好點,太多的Spring和依賴注入;-)但在複雜的對象與依賴關係的情況下,我會使用生成器模式,而不是構造函數與10個論據。 – Cygnusx1

0

基本上你想要在構造器中初始化對象的所有基本構建塊。 但有時,該對象包含許多元素,從而使構造函數的參數列表太長。 我遵循以下指導原則:如果構造函數的參數列表多於5個元素,則將新對象的初始化分爲構造函數參數&設置方法。

3

將事情傳遞給構造函數,它們是對象的不可變屬性。如果可能,請使所有對象屬性不可變。充分考慮到這一點,這可以使整個對象不可變。

在構造時分配的不可變屬性避免了各種競爭條件(特別是在多線程環境中),並有助於確保對象始終一致,從而消除了多種錯誤的可能性。通過強制在構建時定義屬性,可以避免大量的錯誤檢查代碼。一旦整個對象不可變,就有機會共享等價對象,提高內存性能。

如果一個參數不是對象的不可變屬性,那麼在構造函數中指定它只是一個方便。一般來說,它應該被賦予一個setter來減少代碼的複雜性(因爲無論如何setter都是必需的)。如果構造函數經常被調用,那麼參數的方便可能值得這個額外的複雜性。

+0

不可變?像數據庫連接到模型對象?謝謝。 – thom

+1

不可變意味着對象不能以呼叫者可見的方式改變。如果我要求一個不變的字符串作爲其第三個字符,那麼這將是字符串整個生命週期的第三個字符。可變字符串是可以隨時間變化的字符串。諸如緩存之類的內部數據結構不是可變性的一部分,因此它並不意味着對象的文字內存不會改變。但是從外部世界來看,對於同樣的問題你總能得到同樣的答案。 http://en.wikipedia.org/wiki/Immutable_object –