我通常選擇在構造函數中初始化對象的所有屬性。這裏是我的推理:
你可以不小心設置一些對象的屬性和現在其他的,在僞代碼:
obj = new Obj(prop_a, prop_b, prop_c) // Error if not all three properties are set
method_requiring_all_three_values_are_initialized(obj)
VS
obj = new Obj() //No error, becuase constructor doesn't take the arguments
obj.set_prop_a(val);
obj.set_prop_b(val_2);
method_requiring_all_three_values_are_initialized(obj) // Runtime error
而且,如果對象是不可變的(在構建它之後你不能修改它),所以你的代碼會更容易維護,因爲你不必擔心對象的狀態。見Mutable vs immutable objects
但是,如果你的剖析代碼和對象屬性的早期初始化後變成透明的瓶頸,你可以重構後面的代碼初始化爲優化,我敢肯定,你聽說過高德納報價:
「我們應該忘記小的效率,講的 時間約97%:過早的優化是所有罪惡的根源」
爲了您的具體問題,我會小號從用戶分離的朋友列表,因爲它會使用戶對象更容易推理(你不必擔心它設置了什麼狀態,或者如果屬性定義得很好,你只知道用戶是用戶... )您可以擁有一個數據結構和函數,它接受一個用戶對象並返回其相應的好友列表。
比方說,我們有一個用戶對象與一個friendslist屬性(用戶數組)。如果必須設置好friendslist屬性,那麼每個「朋友」用戶都必須使用自己的好友列表進行初始化......並且這將永遠持續下去?但是,好像朋友列表適合作爲用戶的屬性 - 那麼我們是否將用戶列表與用戶分開,或者可以隨後設置好朋友列表? - 將這添加到我的q。 – Titus
蘋果和橘子。 [延遲加載](http://en.wikipedia.org/wiki/Lazy_loading)與Eager加載是一個非常**不同的問題。閱讀[代理模式](http://en.wikipedia.org/wiki/Proxy_pattern)。 –
延遲加載的概念很有趣,但肯定會延遲加載導致對象設置自己的屬性? – Titus